x86中 div汇编指令问题

CrazyCater 2014-01-11 08:34:50
看书上说当div的除数为16位时用DX:AX做被除数,商放到AX中,余数放到DX中,但是如果商的值大于16位能表示的值时怎么办呢?
...全文
530 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
落尘剑 2014-06-19
  • 打赏
  • 举报
回复
;以下计算1到10000的和 xor ax, ax xor dx, dx mov cx, 10000 @f: add ax, cx adc dx, 0 loop @f ;以下计算累加和的每个数位 xor cx, cx mov ss, cx ;设置堆栈段的段基址 mov sp, cx mov bx, 10 xor cx, cx @d: inc cx mov bp, ax mov ax, dx xor dx, dx div bx xchg bp, ax div bx or dl, 0x30 push dx mov dx, bp cmp dx, 0 jne @d cmp ax, 0 jne @d
赵4老师 2014-06-19
  • 打赏
  • 举报
回复
;以下计算1到10000的和
        xor ax, ax
        xor dx, dx
        mov cx, 10000
     @f:
        add ax, cx
        adc dx, 0
        loop @f


        ;以下计算累加和的每个数位
        xor cx, cx
        mov ss, cx  ;设置堆栈段的段基址
        mov sp, cx

        mov bx, 10
        xor cx, cx
     @d:
        inc cx
        mov bp, ax
        mov ax, dx
        xor dx, dx
        div bx
        xchg bp, ax
        div bx
        or dl, 0x30
        push dx
        mov dx, bp
        cmp dx, 0
        jne @d
        cmp ax, 0
        jne @d
lm_whales 2014-01-14
  • 打赏
  • 举报
回复
第一次, 商 qh (在AX中)余数是 rh'
第二次, 商 ql 余数是 remain 
所以两次除法,足够了。
只是需要把  qh (在AX中)处理好---存放到商的高位
XL取到 AX中 rh'(在DX中不动),,接着用于第二次除法

        qh ql  
   ------------
y  ) 0 xh  xl      第一次除法 DX=0,AX=xh
       ..
  --------------
        rh' xl     第二次除法 DX=rh',不动,AX=xl  
        ......
        --------
           remain  余数在DX中

就可以了,所以不是很复杂

就是第一次,DX初始化为0
然后,自高向低,依次取出X 的各16Bits,放入 AX寄存器中,开始除。
这就像10进制的多位数除1位数,实际上还是比较简单的。
这是除法指令,设计出来就是这样的效果。

如果是高级语言,就比较麻烦了;
汇编语言一次计算,可以得到商和余数。
所以,比较简单。
大概代码如下:
Mov DX,0
Mov AX,x+2
mov BX ,y
div BX       ;第1次除法

mov q+2,AX
mov AX,x
div BX        ;第2次除法
mov q,AX
mov remain,DX
「已注销」 2014-01-13
  • 打赏
  • 举报
回复
前面有人说两次除,其实没那么简单,首先要试商,试完了要乘,乘完要判断大小,然后调整。
「已注销」 2014-01-13
  • 打赏
  • 举报
回复
引用 4 楼 CrazyCater 的回复:
就是在8086的那种情况 只有16位的时候怎么办
看《计算机程序设计艺术》多精度算数
Mr. Code 2014-01-13
  • 打赏
  • 举报
回复
32 bit: edx, eax 64 bit: rdx, rax
lm_whales 2014-01-12
  • 打赏
  • 举报
回复
引用 1 楼 lm_whales 的回复:
扩展一下,接着除 比如: 改成 BX:DX:AX 左移8位再除
哦想起来了不用移位,就可以了 DX:AX 先用 DX --》0 AX高16 去除 再把余数放到DX,AX 低 16 通过两次除法,就可以算出32Bits的商了
movsd 2014-01-12
  • 打赏
  • 举报
回复
假设被除数高16位B,低16位A,除数C mov ax,B xor dx,dx div C mov cx,ax mov ax,A div C 商:CX:AX, 余数: DX
CrazyCater 2014-01-11
  • 打赏
  • 举报
回复
就是在8086的那种情况 只有16位的时候怎么办
movsd 2014-01-11
  • 打赏
  • 举报
回复
64位除法用 RDX RAX
relaxisland 2014-01-11
  • 打赏
  • 举报
回复
32位除法用 EDX EAX
lm_whales 2014-01-11
  • 打赏
  • 举报
回复
扩展一下,接着除 比如: 改成 BX:DX:AX 左移8位再除

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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