Einzelnen Beitrag anzeigen

Dannyboy

Registriert seit: 4. Aug 2003
Ort: Delphi-Heaven
418 Beiträge
 
Delphi 7 Personal
 
#1

Division (Bit-Shifting) in ASSEMBLER

  Alt 18. Mär 2004, 10:18
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
How much wood would a wood-chuck chuck if a wood-chuck would chuck wood?
Check this out.
DANNYBOY
  Mit Zitat antworten Zitat