Binär in ASCII

Gast #2588669
Lesenswert?

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
#2588683
Lesenswert?

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
#2588715
Lesenswert?

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
Gast #2588811
Lesenswert?

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?
#2588830
Lesenswert?

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
#2588834
Lesenswert?

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
Gast #2588883
Lesenswert?

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?
Gast #2588888
Lesenswert?

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
Gast #2588943
Lesenswert?

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
#2588969
Lesenswert?

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
Gast #2589735
Lesenswert?

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
Angehängte Dateien:
Gast #2589761
Lesenswert?

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....
#2589819
Lesenswert?

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
#2589926
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren