Dividieren in Assembler



  • Mir wurde von meiner Hochschule folgende Aufgabe in Assembler "hingeklatscht":

    Erstellen Sie folgendes Programm in Assembler:
    1. Erstellen Sie ein neues ASM-Programm in Jasmin
    2. Verwenden Sie das AL-Register um die Zahlen 9 und 8 miteinander zu Addieren.
    3. Subtrahieren Sie nun 2 von der im Akkumulator befindlichen Zahl.
    4. Dividieren Sie das Ergebnis durch 7
    5. Beobachten Sie das EAX-Register im Simulator. Was ist hier passiert ?

    Mein erste Lösungsansatz wäre nun das Folgende:

    mov al,9
    add al,8
    sub al,2
    

    Wie teile ich hier nun durch 7?

    div al,7
    

    funktioniert ja nicht.



  • http://x86.renejeschke.de/html/file_module_x86_id_72.html
    Du brauchst also:

    ;al befüllen
    mov ah, 0 ;xor ah, ah tut dasselbe. setzt das höhere byte von ax auf 0
    mov bl, 7 ;divisor
    div bl ; teilt ax durch bl, Ergebnis landet in al
    


  • Demnach:

    mov al,9
    add al,8
    sub al,2
    mov ah, 0
    mov bl, 7
    div bl
    

    ? Hierbei kommt aber 258 raus, nicht 2,5. Wieso muss ich "ah" die "0" zuweisen? Und wieso teilt er bei "div bl" al durch bl und nicht zum Beispiel ah durch bl? Sorry für die dummen Fragen, aber heute wurde erst mit Assembler angefangen und nicht wirklich viel darüber erzählt.



  • div reg8 teilt (implizit) ax durch reg8, in dem fall also bl (reg8 = 8 bit register) und speichert den quotient (implizit) in al und den rest in ah.
    Die register al und ah ergeben ja zusammen ax, dh al enthält das untere byte und ah das obere von ax.
    Wenn al nun 2 ist und ah 1, steht insgesamt in ax also 258.
    Da es keine Möglichkeit gibt, ein 8 bit register wie al zu dividieren, muss man einen kleinen umweg machen: man setzt das obere byte von ax auf null (= mov ah, 0), sodass in ax nur noch der wert von al steht (wie mov ax, al, nur dass das eben nicht geht.)
    Dann dividiert div bl den wert in ax durch bl und das ergebnis steht in al.
    Beachte außdem dass das eine ganzahl-division ist.



  • Warum steht in EAX 258, wenn al 2 und ah 1 ist?



  • al = unteres byte von ax, ah = oberes byte von ax.
    wenn al = 2 (binär 00000010) und ah = 1 (binär 00000001) ist und das ganze zusammentun steht in ax: 0000000100000010 = dezimal 258.
    eax ist übrigens ein 32 bit register, welches ax als untere 16 bit enthält.

    eax: 00000000000000000000000100000010
    ax:                  0000000100000010
    ah:                  00000001
    al:                          00000010
    

    Das ganze gilt übrigens auch für die register ebx (bx, bl, bh), ecx(cx, cl, ch) edx (dx, dl, dh) sowie andere, welche mit e anfangen (edi zb. enthält das register di als untere 16 bit, genau wie mit esp und sp, ebp und bp etc.)


Log in to reply