assume cs:code
code segment
start:
mov ax,4240H
mov dx,000FH
mov cx,0AH
call divdw
mov ax,4c00H
int 21H
; 名称: divdw
; 功能: 进行不会溢出的除法运算
; 参数:(ax)=dword型数据的低16位
; (dx)=dword型数据的高16位
; (cx)=除数
; 返回 (dx)=结果的高16位,(ax)=结果的低16位
; (cx)=余数
; 公式: X/N = INT(H/N)*65536 + [REM(H/N)*65536+L]/N
divdw:
PUSH DI
PUSH SI
PUSH BX
MOV BX,AX
MOV BP,DX
MOV AX,DX
MOV DX,0
DIV CX ; AX保存商,DX保存余数
MOV SI,AX ; 保存高位的商
MOV DX,0
MOV AX,BP
DIV CX
MOV DI,DX ; 保存高位的余数
MOV DX,DI
MOV AX,BX
DIV CX ; 计算低位字节
MOV CX,DX
MOV DX,SI
POP BX
POP SI
POP DI
RET
code ends
end start
经fpamc提醒后,简化后代码如下:
assume cs:code
code segment
start:
mov ax,4240H
mov dx,000FH
mov cx,0AH
call divdw
mov ax,4c00H
int 21H
; 名称: divdw
; 功能: 进行不会溢出的除法运算
; 参数:(ax)=dword型数据的低16位
; (dx)=dword型数据的高16位
; (cx)=除数
; 返回 (dx)=结果的高16位,(ax)=结果的低16位
; (cx)=余数
; 公式: X/N = INT(H/N)*65536 + [REM(H/N)*65536+L]/N
divdw:
PUSH DI
PUSH SI
PUSH BX
MOV BX,AX
MOV AX,DX
MOV DX,0
DIV CX ; 除法执行后AX保存商,DX保存余数
MOV SI,AX ; SI保存高位的商
MOV AX,BX
DIV CX ; 计算低位字节
MOV CX,DX
MOV DX,SI
POP BX
POP SI
POP DI
RET
code ends
end start
- [assumechen] 呵呵,我把程序搞复杂了。谢谢! 07/12 23:58
- [fpamc] MOV BX,AX MOV AX,DX MOV DX,0 07/11 23:26
- [assumechen] 这个公式原来一直想不明白,总是觉得会溢出,直到看到这个贴子才转过来。 http://www.asm 07/11 21:19
- [assumechen] 谢谢! 07/11 21:16
- [fpamc] 对的。 07/09 23:04
- [assumechen] 谢谢 06/30 22:34
- [assumechen] 谢谢 06/30 22:33
- [fpamc] 对的。 06/30 10:26
- [fpamc] 恩对的, 06/30 10:24
- [assumechen] 是程序错了,把这一句: mov word ptr es:[0dH],ax ; 雇员的平 06/29 14:45
[ assumechen 发表于 2012-07-11 21:19 ]
这个公式原来一直想不明白,总是觉得会溢出,直到看到这个贴子才转过来。
http://www.asmedu.net/bbs/pasteinfo.jsp?part=1&level=book&kind=1011&qkSg=2&qID=37084&readSg=1
[ fpamc 发表于 2012-07-11 23:26 ]
MOV BX,AX
MOV AX,DX
MOV DX,0
DIV CX ; AX保存商,DX保存余数
MOV SI,AX ; 保存高位的商
MOV AX,BX
DIV CX ; 计算低位字节
MOV CX,DX
MOV DX,SI
我把你的代码简化后的样子,你看一下这样如何?
[ assumechen 发表于 2012-07-12 23:58 ]
呵呵,我把程序搞复杂了。谢谢!