王爽书上这个无溢出除法,看不懂啊,求讲解

anglesean8 2012-11-20 04:39:25
dx装被除数高位,ax装被除数低位,cx装除数,计算0f4240h除以0ah,用下面公式:
高位/cx的商*65536+[高位/cx的余数*65536+低位]/cx 可以实现无溢出除法,
divew段代码看不懂啊,它是怎样实现的啊,它连公式里面的*65536这个都没看到,怎么就实现了呢,
最终结果是dx装商的高位,ax装结果的低位,cx装余数。

assume cs:code,ss:stack

stack segment
dw 8 dup(0)
stack ends
code segment

start:

mov ax,stack
mov ss,ax
mov sp,10h
mov ax,4240h
mov dx,0fh
mov cx,0ah
call divdw
mov ax,4c00h
int 21h

divdw: ;子程序定义开始
push ax
mov ax,dx
mov dx,0
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx ;dx:ax/cx=高位的商*65536+[高位的余数*65536+位]/cx ret ;子程序定义结束
code ends
end star

...全文
187 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
子善旬 2012-11-20
  • 打赏
  • 举报
回复
(dx,ax)/cx本身就表示(dx*65536+ax)/cx
子善旬 2012-11-20
  • 打赏
  • 举报
回复
mov ax,dx mov dx,0 div cx mov bx,ax ; bx=高位/cx的商 pop ax ;dx=高位/cx的余数,ax=原来的低位,就是 高位/cx的余数*65536+低位 div cx mov cx,dx mov dx,bx ;dx=最后结果的商的高位,ax=最后结果的商的低位,cx=最后结果的余数
eagleatustb 2012-11-20
  • 打赏
  • 举报
回复
公式里面的*65536,是用ax=0,dx=(高位/cx的商)来实现的,也就是说一个数要*65535,只要把这个数左移16位,在这里因为ax是被除数的低位,dx是被除数的高位,只要把数值放到dx中,再把ax置0就可以了。 mov dx,bx ;dx:ax/cx=高位的商*65536+[高位的余数*65536+位]/cx 这里没有把ax置0,是因为前面的 pop ax div cx 已经算出来ax是低16位除以cx的商,本来就要加上ax的值作为被除数。

21,499

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧