我的汇编代码有问题。每当我调试此代码时,分区溢出始终是错误。当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
答案 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/m32
或DIV r/m64
。我将此作为练习留给您查看英特尔指令集参考。