汇编语言 - 除法溢出(4 位)

Assembly Language - Division Overflow (4 digits)

我的汇编代码有问题。每当我调试此代码时,分区溢出总是错误。当 AX 的值只有两位数时,代码运行流畅。

我需要做哪些更改才能使除法使用 4 位数值?谢谢

    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

当您执行 DIV r/m8(例如 DIV BL)时,商将存储在 AL 中,因此如果商大于 255,您将得到除法溢出。

如果您希望能够处理高达(但不包括)65536 的商,请使用 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

为了能够处理更大的商,请使用 DIV r/m32DIV r/m64。我将把它留作练习,供您在英特尔的指令集参考中查找它们。