汇编语言字除法,如果AX寄存器中商大于FFFFH怎么办?
答案:1 悬赏:80 手机版
解决时间 2021-04-05 04:02
- 提问者网友:风月客
- 2021-04-04 14:02
汇编语言字除法,如果AX寄存器中商大于FFFFH怎么办?
最佳答案
- 五星知识达人网友:woshuo
- 2021-04-04 15:10
这个时候就溢出了。需要编制专门的子程序处理,以下是一种实现:
;***********************************************************
DIVI PROC NEAR
PUSH SI
PUSH DI
PUSH BP
PUSHF
; 被除数置于 dx,ax (32位)
; 除数置于 bx (16位)
; 商置于 dx,ax
; 余数置于 cx
;-------------------
;PUSH BX
;POP BP
MOV WORD PTR [R_BX], BX
MOV WORD PTR [RE_DIV],0
MOV WORD PTR [RE_DIV+2],0
MOV BP,08000H ; 检查被除数的最高位是否为1
AND BP,DX ; 是 则超出计算上限 ,直接退出
CMP BP,08000H
JE @DIVIEXIT
CMP DX,0
JNE @DIVI0
CMP AX, WORD PTR [R_BX]
JNC @DIVI0
JMP @DIVIEXIT
@DIVI0:
MOV DI,0
MOV SI, WORD PTR [R_BX]
MOV CX,1
MOV BX,0
@DIVI1: PUSH AX
PUSH DX
SUB AX,SI
SBB DX,DI
JC @DIVI2
SHL SI,1
RCL DI,1
SHL CX,1
RCL BX,1
POP DX
POP AX
JMP @DIVI1
@DIVI2: SHR DI,1
RCR SI,1
SHR BX,1
RCR CX,1
POP DX
POP AX
SUB AX,SI
SBB DX,DI
ADD WORD PTR [RE_DIV],CX
ADC WORD PTR [RE_DIV+2],BX
;---------------------
CMP DX,0
JNE @DIVI0
CMP AX, WORD PTR [R_BX]
JNC @DIVI0
;----------------
PUSH AX
MOV DX,WORD PTR [RE_DIV+2] ; 商的高位
MOV AX,WORD PTR [RE_DIV] ; 商的低位
POP CX ; 余数
MOV BX, WORD PTR [R_BX]
;----------------
POPF
POP BP
POP DI
POP SI
RET
RE_DIV DD 0
R_BX DW ?
@DIVIEXIT:
MOV CX,AX
MOV DX,0
MOV AX,0
MOV BX,WORD PTR [R_BX]
POPF
POP BP
POP DI
POP SI
RET
DIVI ENDP
;********************************************************
;***********************************************************
DIVI PROC NEAR
PUSH SI
PUSH DI
PUSH BP
PUSHF
; 被除数置于 dx,ax (32位)
; 除数置于 bx (16位)
; 商置于 dx,ax
; 余数置于 cx
;-------------------
;PUSH BX
;POP BP
MOV WORD PTR [R_BX], BX
MOV WORD PTR [RE_DIV],0
MOV WORD PTR [RE_DIV+2],0
MOV BP,08000H ; 检查被除数的最高位是否为1
AND BP,DX ; 是 则超出计算上限 ,直接退出
CMP BP,08000H
JE @DIVIEXIT
CMP DX,0
JNE @DIVI0
CMP AX, WORD PTR [R_BX]
JNC @DIVI0
JMP @DIVIEXIT
@DIVI0:
MOV DI,0
MOV SI, WORD PTR [R_BX]
MOV CX,1
MOV BX,0
@DIVI1: PUSH AX
PUSH DX
SUB AX,SI
SBB DX,DI
JC @DIVI2
SHL SI,1
RCL DI,1
SHL CX,1
RCL BX,1
POP DX
POP AX
JMP @DIVI1
@DIVI2: SHR DI,1
RCR SI,1
SHR BX,1
RCR CX,1
POP DX
POP AX
SUB AX,SI
SBB DX,DI
ADD WORD PTR [RE_DIV],CX
ADC WORD PTR [RE_DIV+2],BX
;---------------------
CMP DX,0
JNE @DIVI0
CMP AX, WORD PTR [R_BX]
JNC @DIVI0
;----------------
PUSH AX
MOV DX,WORD PTR [RE_DIV+2] ; 商的高位
MOV AX,WORD PTR [RE_DIV] ; 商的低位
POP CX ; 余数
MOV BX, WORD PTR [R_BX]
;----------------
POPF
POP BP
POP DI
POP SI
RET
RE_DIV DD 0
R_BX DW ?
@DIVIEXIT:
MOV CX,AX
MOV DX,0
MOV AX,0
MOV BX,WORD PTR [R_BX]
POPF
POP BP
POP DI
POP SI
RET
DIVI ENDP
;********************************************************
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯