Könnte jemand mir dieses Code schritt für schritt erklären?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Du erinnerst Dich: Ein 8.8-Wert x sieht im Register aus wie ein Integer 256x. Wenn Du zwei solche Werte x, y mit IDIV dividierst, kommt 256x/256y=x/y heraus, aber als Integer ohne Kommastellen. Das ist schlecht.

Dem kann man abhelfen, indem man den 32-Bit-Wert 256x durch y teilt. Der Prozessor rechnet dann (256·256x) / 256y = 256(x/y). Das Ergebnis hat dann sogar schon das fertige 8.8-Format (falls es im erlaubten Bereich −128.0 bis +127.996 liegt).

Der IDIV-Befehl braucht dafür den 32-Bit-Wert 256·AX in den Registern DX:AX. Aus der Eingabe

  • AX = abcd

muss also

  • DX = ssab
  • AX = cd00

werden. ss=00h oder FFh ist dabei das Vorzeichen von AX.

Die Musterlösung macht das etwas kompliziert:

  1. Eingabe: EAX = ????abcd
  2. shl EAX, 16 ⇒ EAX = abcd0000
  3. sar EAX. 8 ⇒ EAX = ssabcd00
  4. mov EDX, EAX
  5. shr EDX, 16 ⇒ EDX = 0000ssab

Die beiden fettgedruckten Teile bilden den Zähler DX:AX für die Division.

Ich würde das etwas kürzer machen:

  1. Eingabe: AX = abcd, DX = ????
  2. mov DX, AX ⇒ AX = DX = abcd
  3. shl AX, 8 ⇒ AX =cd00
  4. sar DX, 8 ⇒ DX = ssab
AchSo774 
Fragesteller
 11.03.2023, 17:24

Vielen vielen Dank für diese tolle Erklärung !!

ich bin wirklich glücklich, weil ich das endlich verstanden habe :)

0
shl eax, 16

Alle Bits im Register EAX werden 16 Mal nach links geschoben.

sar eax, 8

Alle Bits im Register EAX werden 8 Mal nach rechts geschoben. Das MSB (Bit mit dem höchsten Stellenwert) bleibt aber wie zuvor.

mov edx, eax

Die Bits vom Register EAX werden ins Register EDX übertragen.

shr edx, 16

Alle Bits im Register EDX werden 16 Mal nach rechts geschoben.

Die beiden ersten Instruktionen ergeben insgesamt eine Multiplikation von EAX mit 256 (16 Mal nach links + 8 Mal nach rechts = 8 Mal nach links), da einmal nach links eine Multiplikation mit 2 gleichkommt. Hier also 2^8. 16 Mal nach rechts hat was mit dem Unterstützen von Vorzeichen zu tun, was ich noch nicht ganz überblicke.

Das Ergebnis, also EAX*256, kommt nun ins Register EDX. Dann wird EDX wieder durch 2^16 = 65536 geteilt.

Woher ich das weiß:Studium / Ausbildung – B.Sc., M.A., M.Sc. & Doktorand