Hallo zusammen,
AUFGABENSTELLUNG:
In folgenden 2 Beispielen (
ASM) werden die Doppelworte <VARIABLE>
dividiert; im Beispiel I durch den Wert 16 und im Beispiel II durch den
Wert 512. Der Quotient soll jeweils in den Akkumulator geschoben werden.
PROBLEM:
Die Anweisungen im Einzelnen sind mir klar (habe meine Kommentare
dahinter geschrieben), doch ich verstehe absolut nicht, WARUM dieses
Schema funktioniert und WIE es (mathematisch) funktioniert. In den beiden
Beispielen kann ich jeweils die Schritte 1 bis 4 leicht nachvollziehen,
denn die Divisionen erfolgen hier durch das binäre Schieben der
notwendigen Stellen nach rechts. Ab Schritt 5 verstehe ich NIX mehr. Ich
kann weder das AND (in Beispiel I) deuten, noch das nach LINKS (!)
Schieben.
Wäre Euch sehr dankbar, wenn ihr mir bei diesem kleinen Problem helfen
könntet.
Code:
BEISPIEL NUMERO I: DIVISION DURCH 16
VARIABLE DD (?) ; 32 BIT
<ANWEISUNGEN>
1) MOV AX, WORD PTR [VARIABLE] ; LOW-WORD [VARIABLE] IN AX
2) MOV CL, 4 ; CL = 4
3) SHR AX, CL ; AX = AX DIV 16
4) MOV BX, WORD PTR [VARIABLE+2] ; HIGH-WORD [VARIABLE] IN BX
5) AND BL, 0FH ; BX AND 15
6) MOV CL, 4 ; CL = 4
7) SHL BL, CL ; BL = BL * 16
8) ADD AH, BL ; AH = AH + BL
Code:
BEISPIEL NUMERO II: DIVISION DURCH 512
VARIABLE DD (?); 32 BIT
<ANWEISUNGEN>
1) MOV AX, WORD PTR [VARIABLE] ; LOW-WORD [VARIABLE] IN AX
2) MOV CL, 9 ; CL = 9
3) SHR AX, CL ; AX = AX DIV 512
4) MOV DX, WORD PTR [VARIABLE+2] ; HIGH-WORD [VARIABLE] IN DX
5) MOV CL, 7 ; CL = 7
6) SHL DX, CL ; DX = DX * 128
7) ADD AX, DX ; AX = AX + DX