Anfänger-Beispiele
-
Hallo,
ich lerne seit 4 Monaten Assembler zu programmieren auf dem Papier, also so kleiner befehle üben etc., nichts großes.
1. Bsp:
SHIFT_RIGHT_16 <-- Name des Unterprogramms
Input: Vorzeichenlose 16-Bit-Zahl in DPTR.
Funktion: Die Zahl ist durch 2 zu dividieren und DPTR zurück zugeben.
Könnt ihr hier nachvollziehen was ich hier machen soll? Ich vermute mal irgendwas verschieben, vermutlich bits und DPTR durch 2 dividieren vielleicht DPH und DPL.
Mh...Bit-Verschiebe-Befehle sind ja: RL, RR, RLC(mit carry), RRC(mit carry)
Kann mir jemand die Aufgabenstellun näher erklären und Tipps geben dazu bitte?
2. Bsp:
BCD_ASC <-- Name des Unterprogramms
Das Unterprogramm übernimmt im Akku eine gepachte BCD-Zahl(2-stellig) und wandle daraus 2 ASCII-Zeichen. Niederwertige ASCII-Stelle in DPL und Höhere in DPH.
z.B: (A) 0x47
4-->DPH
7-->DPLErstmal was ist eine BCD-Zahl? Ich hab schon auf Wikipedia geguckt, aber ich verstehs nicht.
Hier ist so ein Bild, das ich versucht habe zu verstehn, aber keine Ahnung...
http://upload.wikimedia.org/wikipedia/commons/thumb/2/25/Code_BCD.svg/220px-Code_BCD.svg.pngHier die selbe Frage wie bei Bsp1 bitte.
Ahja und wir verwenden die 8051er Familie(http://mcls-modular.de/DE/helpsys/t_as2.htm).
Danke im voraus!
mfg gast!
-
Das Bld zeigt spaltenweise ein halbes Byte(Nibble; 4 Bit) an.
Die schwarzen Kästchen repräsentieren jeweils ein gesetztes Bit.binar 0001 = dezimal 1 (Nibble)
binar 0010 = dezimal 2
binar 0011 = dezimal 3
binar 0100 = dezimal 4
binar 0101 = dezimal 5
binar 0110 = dezimal 6
binar 0111 = dezimal 7
binar 1000 = dezimal 8
binar 1001 = dezimal 9
binar 1010 = dezimal 10
binar 1011 = dezimal 11
binar 1100 = dezimal 12
binar 1101 = dezimal 13
binar 1110 = dezimal 14
binar 1111 = dezimal 15
..
binar 0001 0000 = dezimal 16 (Byte)
binar 0001 0001 = dezimal 17
...
...
binar 0000 0000 0000 0000 (Word)Dirk
-
Bei BCD-Zahlen entspricht jedes Nibble(4Bit) einer Dezimalstelle, wodurch sie für Anwendungsfälle die mit Dezimalzahlen arbeiten müssen ohne Umwege direkt zur Verfügung stehen. Nachteil ist das du nicht den Wertebereich hast den du sonst in einem Byte, Word etc. unterbringen könntest, da ja alle Wertigkeiten des Nibbles über 9 nicht genutzt werden(A-F).
Der Commodore64(6510) z.B. kann direkt mit BCD-Zahlen rechnen.
-
Ok, ich danke euch!
Ich hab nun zu Bsp1 und zu Bsp2 die fertigen Codes dazu gefunden, ich verstehe die Befehle was sie machen etc., aber ich verstehe nicht warum man auf das kommt.
Bsp1:
clr c mov a,dph rrc a mov dph,a mov a,dpl rrc a mov dpl,a ret
Warum verschieben wir das 2mal also warum 2mal RRC?
Warum muss man hier das Carry ins Spiel bringen, man addiert ja nichts?
RRC verschiebt ja Bits mit inklusiv dem Carry.Bsp2:
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 ret
Leider verstehe ich noch immer die Aufgabenstellung nicht und warum man da das H-Halbyte und L-Lowbyt mit ANL konvertiert und dann mit 30hex addiert warum?
-
BCD Zahlen sind für Programmierer recht einfach zu handlen, weil ja jede einstellige Zahl 1:1 Binär abgebildet wird.
Also 12345 wären 0001 0010 0011 0100 0101 bzw.00010010001101000101
http://gfs.khmeyberg.de/Materialien/IIInformatik/informatik/in010202.htmlDas Problem bei der Codierung sind ungültige Binärnibbles wie die 10 bis 15, die freerac auflistet. Diese müssen z.B. bei Additionen wie 7+8 korrigiert werden. (0111 + 1000 = 1111 ->????...-> 6 bzw. 0110 draufaddieren, dann passt es wieder: 0001 0101) Da die BCD Zahlen viel Platz brauchen, kann man stattdessen Hexcodieren mit A, B, C, D, E, F und so mit 16 Zahlen rechnen, auch sehr gut und einfach. Aber man muß halt konvertieren, wenn man Hexzahlen vorliegen hat. Entweder nach binär und ausmultiplizieren, oder eben durch Dividieren durch Zielzahlenbasis
-> F:A -> 1 Rest 5BCD Zahlen nach ASCII kann leicht durch 30h draufaddieren erledigen.
Multiplizieren und Dividieren durch 2,4,8 und so weiter kann man durch Linksverschieben oder Rechtsverschieben. aus 2 also 0010 wird 4 also 0100 oder 1 also 0001.
Größere Zahlen brauchen noch einen Übertragspeicher. Interessant sind außerdem zu dieser Thematik Algorithmen wie http://www-i1.informatik.rwth-aachen.de/~algorithmus/algo16.phpMan kann sich diese Zusammenhänge wunderbar in dem Windows/Dos-Programm debug angucken, und herumprobieren. Tut von Prof. Weber: ( http://swlx01.hs-esslingen.de/vorl/rt2/debug.pdf )
-
Danke, aber warum muss man UND verknüpfen beim 2. Bsp und warum nimmt man da überhaupt eine BCD-Zahl?
Sorry den Sinn vom 2. Bsp verstehe ich irgendwie nicht. Das 1. íst im Gegensatz klar.
-
Man addiert auf jede einzelne Ziffer 30h also 0011 0000b.
Mit dem and befehl 0F wird der vordere Teil der Beispielbinärzahl gelöscht.
Aus dem Beispiel 0001 0101 wird durch AND zuerst 0000 0101. Jetzt kann man 0011 0000 draufaddieren und hätte die erste Ziffer konvertiert.
Wie geht man bei der zweiten Ziffer von 15 vor?
-
Warum sind die nibbles 10-15 ungültig?
-
gast8051 schrieb:
Warum sind die nibbles 10-15 ungültig?
BCD-Werte in einem Nibbel können maximal von 0-9 gehen.
Alle Werte in einem Nibbel oberhalb von 9, also die Werte von 10-15, sind daher ungeeignet dafür als BCD-Zahl verwendet zu werden.Dirk