;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;子程序描述:
;;;名称:divDW
;;;功能:进行不会产生溢出的出发运算,被除数为Dword型,除数为word
;;; 型号,结果为Dword型
;;;参数:(AX)=Dword型数据的低16位
;;; (DX)=Dword型数据的高16位,(CX)=除数
;;;返回:(DX)=结果的高16位,(AX)=结果的低16位,(CX)=余数
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
assume CS:CODESG, SS:STACKSG
STACKSG SEGMENT
dw 8 dup (0)
STACKSG ENDS
CODESG SEGMENT
start:
mov AX, 4240H
mov DX, 000FH
mov CX, 0AH
call divDw
mov AX, 4C00H
int 21H
divDw:
;分部计算,保存低16位的值
mov BX, AX
;高16位数做除法
mov AX, DX
mov DX, 0H
div CX ;(DX)=余数,(AX)=商
;保存高16位数做除法所得的商
mov SI, AX
;低16位数做除法
;高16位数做除法所得的余数保存在DX中,作为低16位数做被除数的DX中的内容
mov AX, BX
div CX ;(DX)=余数,(AX)=商
mov CX, DX ;余数放入CX中保存
mov DX, SI ;结果的高16位放入DX中保存
ret ;返回子程序调用
CODESG ENDS
END start
难点:int(H/N)*65536 和 rem(H/N)*65536 的理解。
int(H/N)*65536——将int(H/N)放入DX中
rem(H/N)*65536——将rem(H/N)放入DX中
- [游客] 111111111111111113 04/09 01:55
- [tomato] 发现了一个错误。大家在看的时候不妨注意一下。 “2.5堆和栈中的存储内容 栈: 在函数调用时, 04/15 18:03
- [musicvs] 第一题我用一个笨方法算的: 第三条指令就是 10H+90H=A0H ,这里的16进制是补码,然 09/15 12:47
- [fontomas] 第二题已了。 如果寄存器不能保存cmp指令的逻辑结果(超范围),所以实际结果用补码表示。 是这样 08/27 17:03
- [fontomas] SF=1 ? 上面显示的不是 SF=PL吗? 原来“ NV UP EI PL NZ NA P 08/26 16:00
- [mouse] 11.12有debug的标志位显示和标志位的对应关系,可以体验查看一下^_^ 08/26 08:33
- [mouse] mul al zf=0 pf=1 sf=1 这章的答案都 08/26 08:32
- [starrynight] 我顶! 08/25 20:14
- [wuerlang] 嗯,要顶. 08/25 18:03
- [fontomas] 是啊,我本来也想用栈的,可是看到用push/pop那么多次,我就感到快要疯了,所以自作主张改了一下S 08/24 03:10
- [fontomas] 实验一下,Blog突然不能发表文章了! 08/11 21:07
[ 游客 发表于 2008-08-23 15:31 ]
啊!不错的程序。
[ 游客 发表于 2008-08-23 16:40 ]
关键是理解为什么没有溢出的原理,其实,我们就是将数据放大、缩小处理,配合倍数关系,这个原理性的思维方式,在以后可能会经常用到,比如说不支持浮点型,我们就可以将int型放大N*10倍后进行计算,只是要知道最后的结果的与正确数据的关系。
所以,这个题目对于我们很有用哟。呵呵
恭喜博主能够理解并完成。
[ fontomas 发表于 2008-08-23 19:14 ]
谢谢!楼上说的很精辟,有拨云见月之功!