Hallo! Ich hab hier einen Assermbler-Code und dazu die Aufgabenstellung: Das UP übernimmt im Akku eine gepachte BCD-Zahl(2-stellig) und wandle daraus 2 ASCII-Zeichen. Niederwertige ASCII-Stelle in DPL --> höhere DPH Was ist eine "gepachte BCD-Zahl". Also eine BCD-Zahl ist eine Zahl in Binär von 0-9 in Dezimal. Ein Nibble, aber für was braucht man das bei meinem Bsp genau? Code: --------- push acc mov r1,#0x30 anl a,#0x0f add a,r1 mov dpl,a pop acc swap a anl a,#0x0f add a,r1 mov dph,a --------- Also wie komme ich erstmal von einer Binärzahl auf das ASCII-Zeichen? Die Binärzahl in eine BDC-Zahl umwandeln und dann mit 30hex addieren hab ich gelesen. Warum muss ich dann in meinem Programm 2mal UND verknüpfen mittels ANL? Warum das ganze 2mal? Da eine BCD-Zahl nur 4bit hat? Aber ich hab 16Bit, irgendwie verstehe ich das überhaupt nicht ganz, ein bisschen verwirrt bin ich schon. Kann mir bitte einer erklären wie das genau funktioniert. Danke im voraus! mfg guest
Hi
>Was ist eine "gepachte BCD-Zahl".
Das obere Nibble(Bit 7..4) und das untere Nibble (Bit 3...0) enthalten
jeweils eine Zahl.
MfG Spess
guest123 schrieb: > Hallo! > Code: > --------- > push acc akku auf Stack - brauchen wir noch ... > mov r1,#0x30 offset BIN -> ASCII > anl a,#0x0f low-nibble maskieren > add a,r1 in ASCII wandeln > mov dpl,a ins Zielregister kopieren > pop acc akku wiederherstellen auf Ausgangswert > swap a low-nibble und high-nibble tauschen > anl a,#0x0f wieder maskieren > add a,r1 zu ASCII > mov dph,a kopieren Sascha
Danke! Den Code verstehe ich eh was der gemacht, sorry hab ich vergessen zu schreiben, aber warum braucht man hier eine BCD-Zahl warum UNDverknüpfen mit 1111binär? Warum das ganze zweimal?
guest123 schrieb: > Den Code verstehe ich eh was der gemacht, sorry hab ich vergessen > zu schreiben, aber warum braucht man hier eine BCD-Zahl warum > UNDverknüpfen mit 1111binär? Kannst du deine Frage noch mal in einen geordneten Satz kleiden?
guest123 schrieb: > Danke! Den Code verstehe ich eh was der gemacht, sorry hab ich vergessen > zu schreiben, aha? > aber warum braucht man hier eine BCD-Zahl warum > UNDverknüpfen mit 1111binär? > > Warum das ganze zweimal? dann kannst du offenbar den Code und meine Erklärung doch nicht verstehen Bit: 76543210 BCD: ZZZZEEEE ;Z=Zehner, E=Einer && 00001111 == 0000EEEE ;; BCD: ZZZZEEEE swap EEEEZZZZ && 00001111 == 0000ZZZZ Sascha
Aso ok ich glaub ich habs fast verstanden. das ANL dient dazu das das H-Nibble gelöscht wird, also das man nur 30hex zum L-Nibble addiert. Und mit hilfe vom Swap das gleiche nochmal. Soweit so gut. Aber nun stellt sich die Frage warum man hier die BCD-Zahl ins Spiel bringen muss? Warum muss man ausgerechnet mit 4 Bits, also einem Nibble bzw. BCD-Zahl 30hex dazu addieren?
guest123 schrieb: > Code: > --------- > push acc > mov r1,#0x30 > anl a,#0x0f > add a,r1 > mov dpl,a > pop acc > swap a > anl a,#0x0f > add a,r1 > mov dph,a > --------- Man kann das auch anders lösen:
1 | mov b, #16 |
2 | div ab ; A = quotient, B = remainder |
3 | add a, #'0' ; to ASCII |
4 | mov dph, a |
5 | mov a, b |
6 | add a, #'0' ; to ASCII |
7 | mov dpl, a |
Peter
guest123 schrieb: > Aso ok ich glaub ich habs fast verstanden. > > das ANL dient dazu das das H-Nibble gelöscht wird, also das man nur > 30hex zum L-Nibble addiert. Und mit hilfe vom Swap das gleiche nochmal. > Soweit so gut. schön > Aber nun stellt sich die Frage warum man hier die BCD-Zahl ins Spiel > bringen muss? warum hier mit einer BCD-Zahl gearbeitet wird? Weil die Ausgabe das so vorgibt?! > Warum muss man ausgerechnet mit 4 Bits, also einem Nibble bzw. BCD-Zahl > 30hex dazu addieren? Ich verstehe nicht auf was du hinauswillst! BCD-Zahl = Binär Codierte Dezimal-Zahl, das heist eben das 2 Zahlen von 0..9 in einem Byte verpackt sind. Und um aus dem Wert 0..9, das ASCII-Zeichen '0'..'9' zu erhalten muss man eben 30hex addieren, weil 30hex der ASCII-Code für eine '0' ist. Sascha
guest123 schrieb: > Aber nun stellt sich die Frage warum man hier die BCD-Zahl ins Spiel > bringen muss? > > Warum muss man ausgerechnet mit 4 Bits, also einem Nibble bzw. BCD-Zahl > 30hex dazu addieren? Weil die Hex-Zahl 0x34 eben nicht die Dezimalzahl 34 ist, sondern der Zahl 52 entspricht. Du willst aber eine einfache Möglichkeit, wie einer angezeigten Zahl von 34 eine interne Repräsentierung entspricht. Eben 0x34. Und das nennt man dann eben BCD
Ich danke euch! Das heißt also, es ist einfach so, mann muss eine BCD-Zahl(4bit) mit 30hex addieren das man dann den ASCII code bekommt? Das ist wie ein Kochrezept, man braucht Mehl, Zucker, Backpulver etc. das man einen Kuchen backen kann? Kann man so vergleichen?
Hi >Das heißt also, es ist einfach so, mann muss eine BCD-Zahl(4bit) mit >30hex addieren das man dann den ASCII code bekommt? Nur wenn es Zahlen von 0..9, also Dezimalzahlen sind. 0x30 ist übrigens der ASCII-Code für 0 (Null). MfG Spess
spess53 schrieb: > 0x30 ist übrigens der ASCII-Code für 0 (Null). ...und das geht glücklicherweise linear weiter bis 0x39 für '9', darum geht die (einfache) Addition. Gruß Dietrich
guest123 schrieb: > Was ist eine "gepachte BCD-Zahl". Das soll sicherlich eine gepackte BCD-Zahl sein (zwei Ziffern in einem Byte)
Danke! spess53 schrieb: > Nur wenn es Zahlen von 0..9, also Dezimalzahlen sind Warum kann man nicht 10 mit 30hex addieren, also warum funktioniert das nicht?
Hi >Warum kann man nicht 10 mit 30hex addieren, also warum funktioniert das >nicht? Weil der Hexcode für 10 0xA ist. Und das ASCII-Zeichen für 'A' ist 0x41 und nicht 0x3A. Für 10...15 müssen noch mal 7 addiert werden. MfG Spess
guest123 schrieb: > Warum kann man nicht 10 mit 30hex addieren, also warum funktioniert das > nicht? warum soll das nicht funktionieren? Kommt halt ein ':' raus! Sascha
guest123 schrieb: > Warum kann man nicht 10 mit 30hex addieren, also warum funktioniert das > nicht? Kann man schon. Du kannst mit 4 Bit 16 Zustände darstellen - von 0 bis 15. Bei BCD sind aber nur 0-9 gültig. Wenn ich Dich richtig verstanden habe, möchtest Du nun in einer Stelle die Zahl 10 darstellen. Versuch doch einfach mal, 10 mit nur einer Ziffer darzustellen. Wenn Du das doch möchtest, dann ist es auch kein BCD mehr und eine andere Berechnung ist nötig:
1 | // Wandelt A zu dezimal. Einer in DPL, Zehner in DPH |
2 | // Funktioniert nur von 00 - 99 - Hunderter werden abgeschnitten |
3 | |
4 | dec2asc: MOV B, #0x64 // 100 |
5 | DIV AB // Akku durch 100 Teilen |
6 | // Hier könnte man 100er abgreifen |
7 | |
8 | MOV A, B // Der Rest |
9 | MOV B, #10 // wird nun durch 10 |
10 | DIV AB // geteilt |
11 | ADD A, #0x30 // davon den ganzen Teiler zu ASCII |
12 | MOV DPH, A // und speichern |
13 | |
14 | MOV A, B // Der Rest sind einer |
15 | ADD A, #0x30 // auch diese in ASCII |
16 | MOV DPL, A // und speichern |
17 | |
18 | RET |
Gruß Jobst
guest123 schrieb: > Das heißt also, es ist einfach so, mann muss eine BCD-Zahl(4bit) mit > 30hex addieren das man dann den ASCII code bekommt? Grundlagen, wirst Du immer wieder brauchen: http://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange
Hallo, vor Jahren habe ich mir das mal mit dem "patchen" und der BCD -> ASCII-Wandlungvor als PIC-Neuling vor Augen geführt. Daher ist das beiliegende Assembler-File für den PIC 16F628 ein wenig langwierig oder umständlich geraten, sollte aber die Zusammenhänge der "patched Binärzzahl", und auch die Umwandlung in ASCII verständlich in MPLAB Schritt für Schritt nachvollziehbar darstellen. Wer es nachspielen will, dem kann ja die beiliegeden Watchtab evtl. nützlich sien. Gruss GroberKlotz
guest123 schrieb: > Ich hab hier einen Assermbler-Code und dazu die Aufgabenstellung: ....so,da kein posting mehr von dir kommt,denke ich mal das deine hausaufgabe zufriedenstellend durch die user des forums gelöst wurde ;-) guest123 schrieb: > Warum kann man nicht 10 mit 30hex addieren, also warum funktioniert das > nicht? ....tja ein wenig eigeninitiative in form von "mitdenken" hätte diese frage wohl überflüssig gemacht, aber das hier ist ein gutes forum, hier wird dir das denken abgenommen da die user mehr zeit haben als du....
GroberKlotz schrieb: > vor Jahren habe ich mir das mal mit dem "patchen" und der BCD -> > ASCII-Wandlungvor als PIC-Neuling vor Augen geführt. Mit Patchen hat das nichts zu tun, es heißt packed BCD. http://en.wikipedia.org/wiki/Binary-coded_decimal "Uncompressed (or zoned) BCD consumes a byte for each represented numeral, whereas compressed (or packed) BCD typically carries two numerals in a single byte by taking advantage of the fact that four bits will represent the full numeral range." Der obige Code ist 8051 Assembler, daher kann er mit PIC Code überhaupt nichts anfangen. Peter
guest123 schrieb: > Aber nun stellt sich die Frage warum man hier die BCD-Zahl ins Spiel > bringen muss? Weil es manchmal viel einfacher ist, bei der Zahlenmanipulation zu berücksichtigen, dass die nächste Zahl nach 0x09 eben die 0x10 ist. Im Gegenzug spart man sich dafür eine 'aufwändige' Zerlegung einer Zahl bei der Ausgabe um sie in eine lesbare Dezimalzahl zu bekommen. zb Uhr. Die Sekunden (Minuten etc) werden immer nur um 1 erhöht. Dieses Erhöhen in BCD ist trivial.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.