2016-05-12 19 views
0

Ich habe ein Problem mit meinem Assembly Code. Wann immer ich diesen Code debugge, war der Division Overflow der Fehler immer. Der Code läuft reibungslos, wenn der Wert von AX nur zwei Ziffern beträgt.Assembly Language - Division Overflow (4 Ziffern)

Welche Änderungen muss ich vornehmen, damit die Division mit 4-stelligen Werten arbeitet? Vielen Dank.

ASSUME DS:DATA, CS:CODE 

    DATA SEGMENT 

    X  DW   0 

    Y  DW   ? 

    s  DB   "The aswer is", 0 

    Z  DW   4 

    DATA ENDS  
    CODE SEGMENT 

    MAIN PROC 

    MOV DS:[Y],23 
    MOV AX,[Y] 
    ADD AX,4556 
    MOV [X],AX 
    PUSH[X] 
    CALL WRITE 
    POP[X] 

    MOV AH,4CH 
    INT 21H 

    MAIN ENDP 

    WRITE PROC 

    PUSH BP 
    MOV BP,SP 

    MOV AX,0B800H 
    MOV ES,AX 
    MOV ES,AX 
    MOV DI,5*160 

    MOV AX,[BP+4] 
    MOV BL,10 
    DIV BL 
    ADD AL,'0' 
    STOSB 

    XCHG AH,AL 
    ADD AL,'0' 
    STOSB 
    MOV AL, 00001111B 
    STOSB 

    POP BP 
    RET 
    WRITE ENDP 

    CODE ENDS 
    END  MAIN 
+0

Sie können 'ax ', 00'' (oder' 3030h') hinzufügen, um al und ah gleichzeitig zu tun. Dann können Sie sie "stosw" auf einmal speichern. Und Sie können 'mov byte ptr [di], 00001111B' anstatt zuerst einen Wert in' AL' eingeben. –

Antwort

3

Wenn Sie das tun DIV r/m8 (z DIV BL) der Quotient wird in AL gespeichert werden, so dass, wenn der Quotient größer als 255 ist, werden Sie eine Division Überlauf erhalten.

Wenn Sie wollen in der Lage sein Quotienten zu handhaben bis zu (aber nicht einschließlich) 65536, verwenden DIV r/m16:

XOR DX, DX ; DIV r/m16 divides the 32-bit value DX:AX by the divisor, so we need to clear DX 
MOV BX, 10 
DIV BX 
; The quotient is now in AX, and the remainder in DX 

der Lage sein, noch größere Quotienten zu handhaben, verwenden DIV r/m32 oder DIV r/m64. Ich überlasse es Ihnen als Übung, sie in Intels Befehlssatz-Referenz nachzuschlagen.