王爽《汇编语言》第十章实验十 子程序2(divdw) 题目解答

; 子程序:divdw
; 要求:进行不会除法溢出的除法运算,被除数为dword,除数为word,结果为dword
; 参数:(ax) = 被除数dword型的低16位
;  (dx) = 被除数dword型的高16位
;  (cx) = 除数
;
; 返回:(dx) = 结果的高16位
;  (ax) = 结果的低16位
;  (cx) = 余数
;
; 测试例子:1000000/10 (F4240h/0ah)
;  mov ax, 4240h
;  mov dx, 000Fh
;  mov cx, 0ah
;  call divdw
;
; 结果为:(dx) = 0001h, (ax) = 86a0h, (cx) = 0
;
; 公式:X/N = int(H/N) *65536 + [rem(H/N) *65536 + L ]/N
; int 为求整,rem为求余
; 
; 公式的真正意思:
; 1、原来那个32位数的高16位除以除数(N),把得到的商做为最后结果商的高16位 int(H/N)*10000H ( 65536 = 2^16 )
; 2、把上面除法得到的余数左移16位再加上原来32位数的低16位([rem(H/N)*10000H+L])构成了一个新的32位然后用它再除以除数(N),会得到一个新的商和一个余数(均为16位的),
;       把余数作为结果的余数存入cx中,把商作为最后结果商的低16位存入ax中 

assume cs:code, ds:data, ss:stack

data segment
 db 16 dup(0)
data ends

stack segment
 db 16 dup(0)
stack ends


code segment

start:
 mov ax, stack
 mov ss, ax
 mov sp, 16

 mov ax, data
 mov ds, ax
 
 mov ax, 4240h
 mov dx, 000Fh
 mov cx, 0ah
 call divdw

 mov ax, 4c00h
 int 21h

divdw:
 mov bx, ax ; 缓存ax——被除数的低16位
 mov ax, dx ; ax = H, 被除数的高16位
 mov dx, 0
 div cx  ; ax 为商,dx为余数 = rem(H/N) * 65536
 
 push ax  ; 结果的商,也就是最后要放在dx中的

 mov ax, bx ; dx为 rem(H/N) * 65536, 为高16位,ax为低16位,再进行一次除法运算
 div cx  ; ax 为商——最后结果的低16位,dx为余数——为最后结果,应赋给cx

 mov cx, dx
 pop dx

 ret

code ends
end start 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值