汇编语言 - 分部溢出(4位数)

时间:2016-05-12 06:48:34

标签: assembly stack division tasm

我的汇编代码有问题。每当我调试此代码时,分区溢出始终是错误。当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

1 个答案:

答案 0 :(得分:3)

当您执行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。我将此作为练习留给您查看英特尔指令集参考。