汇编语言 - 除法溢出(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/m32
或 DIV r/m64
。我将把它留作练习,供您在英特尔的指令集参考中查找它们。
我的汇编代码有问题。每当我调试此代码时,分区溢出总是错误。当 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/m32
或 DIV r/m64
。我将把它留作练习,供您在英特尔的指令集参考中查找它们。