Einzelnen Beitrag anzeigen

tommie-lie
(Gast)

n/a Beiträge
 
#6

Re: Division (Bit-Shifting) in ASSEMBLER

  Alt 18. Mär 2004, 15:25
Ist das dein Code? Dann solltest du eigentlich wissen, was du da verzapft hast

Zuerst: Seit 10 Jahren gibt es das Register EAX, sind schon 32 bit, dann sparst du dir das aufsplitten des Wertes auf AX und BX.

So, dann mal zu deinem bisschen Code:
Variante I ist keine echte 32bit-Division. Du schnappst dir die ersten 16 bits und dividierst sie korrekt durch 4 durch einen schnellen leftshift. So, das bedeutet ja, daß die untersten 4 bits rausgefallen sind und die oberen 4 bits durch Nullbits ersetzt wurden, du hast jetzt in AX also eine 12bit-Zahl. Dann schnappst du dir das höherwertige Word der Variable in BX, beachtest aber nur BL, dadurch ignorierst du die oberen 16 bits, du hast also nur ein Byte.
Wir haben uns gemerkt, in AX sind die oberen 4 bits noch "frei", also suchst du dir aus BL die unteren 4 (0x0F), die oberen 4 werden auf 0 gesetzt (da du ja nach links shiftest, ist das AND eigentlich überflüssig). Jetzt shiftest du sie nach links, in BL stehen jetzt also in den Bits 0-3 (von rechts!!) lauter Nullen und in den Bits 4-7 die untersten 4 bits des High Words der Variable. Um diese 4 Bits in AH zu verfrachten, wo wir ja noch 4 "freie" Bits haben, führst du ein ADD aus (gleichbedeutend mit OR).
Insgesamt hast du also die unteren 16+4=20 Bits der Variable genommen, die unteren 4 weggeschnippelt und aufrücken lassen, eine 20bit-Division durch 16.

In Beispiel II sieht's genauso aus:
Du teilst das Low-Word ganz normal. Da 512 binär 1000000000 (9 Nullen) ist, hast du jetzt in AX die oberen 9 Bits "frei". 16-9=7, also brauchst du noch die unteren 7 Bits des High-Words. Diese besorgst du dir, indem du (dismal das komplette Register, nicht nur das Low-Byte) um 7 nach links verschiebst und anschließend mit AX ein ADD (OR) ausführst.
Du hast hier also auch keine 32bit-Division, sondern eine 16+7=23bit-Division durch 512.


Aber wie gesagt, 32bit-Berechnungen musst du bei den Intel-Architekturen seit 10 Jahren (genauer: seit i486, bzw IA32) nicht mehr aufsplitten. Und DIV und MUL gibt's auch schon seit 'ner ganzen Weile


Edit: 1. Links und Rechts korrigiert (Hey, ich Gymnasiast, ich muss nicht wissen was links und rechts ist). 2. Satz hinzugefügt.
  Mit Zitat antworten Zitat