有关8086/8088的除法问题。

hncw13 2003-04-12 10:02:27
8086/8088除法指令规定被除数为16位时,除数为8位,被除数16位在AX中,除数由指令中的src操作数给出,商为8位,在AL中,余数为8位,在AH中。被除数为32位时,除数为16位,此时被除数位于DX和AX中,除数由指令中的src操作数给出,商为16位,在AX中,余数也为16位,在DX中。

请问:在8086/8088中,是否可以进行一个字节除以一个字节(或一个字除以一个字)的除法。如果可以,那商和余数分别保存在哪?
...全文
402 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zara 2003-04-15
  • 打赏
  • 举报
回复
之所以用 xor ax, ax 而不用 mov ax, 0 来清 ax 为 0, 是因为 xor 指令比 mov 短, 且在以前的cpu上, 执行的速度也快, 现在在速度上已经没有区别了:
33 C0 XOR AX, AX ; 2 个字节
B8 00 00 MOV AX, 0000 ; 3 个字节
zara 2003-04-14
  • 打赏
  • 举报
回复
UT2K3(虚幻) & loveghb(毒药) :
xor ax, ax 的目的不是将CF清0, 而是将ax清0. 将 ax 清0的目的, 是由于下面是用ax作被除数, 而只原始的被除数只有8位, 放在了al中, 所以应将ah置为0, 而用xor ax, ax是达到这一目的的比较简洁的方法.

hncw13(13):
单就除法指令本身而言, 都是用16位除以8位(或32位除以16位)的, 所以, 如果你的数据不满足这个要求, 一定要在执行除法指令前设置正确的被除数ax(dx:ax), 是无符号数的, 高位ah(dx)清0, 带符号数的则用cbw(cwd)进行带符号扩展.
hncw13 2003-04-14
  • 打赏
  • 举报
回复
没想到会有这么多人参与,真的很为大家的精神所感动,以后一定得好好学习汇编语言。
loveghb 2003-04-14
  • 打赏
  • 举报
回复
楼上的,XOR AX,AX不仅是将AX清零,而且CF也被置0了。如果直接MOV AX,0的话,CF将保持原来的不变。但是一般的程序中都对标志位CF没什么要求的,我奇怪的是很多的程序都在这些对CF无任何要求的地方写XOR AX,AX,而不是写MOV AX,0
难道这是一个“技巧”吗?
虽然我也一直这么写,但是既然UT2K3(虚幻) 提出来了,我也就来问问了。


loveghb 2003-04-13
  • 打赏
  • 举报
回复
关于除法规则,我想这应该是死的吧,它就是这么规定的呀。
不管你怎么巧妙,还是逃不脱它的手掌心的!
这就是汇编。
UT2K3(虚幻)的问题我也想问问,
在清零时用XOR是习惯用法呢,还是别有用心?

zara 2003-04-13
  • 打赏
  • 举报
回复
以一个字节除以一个字节, 还是要先将被除数扩展到字, 存放在 ax 中, 再进行除法运算:
无符号数: (DIV)
xor ax, ax
mov al, xx ; xx 是被除数
带符号数: (IDIV)
mov al, xx ; xx 是被除数
cbw ; 带符号扩展
hncw13 2003-04-13
  • 打赏
  • 举报
回复
那是不是说,在8086/8088中做除法实际上都是用16位的数除以8位的数(或32位的数除以16位)。即使你送的数不满足条件,也会隐式地进行转换,以满足它的除法指令?
我现在想做一个8位的ALU,数据是手工输入的。那是不是在做除法时,必须满足被除数为16位,除数为8位?
UT2K3 2003-04-13
  • 打赏
  • 举报
回复
楼上的,你的第一句xor ax, ax的目的应该是将CF标志清零,我想问一下先清零一般做什么用?另外,AND和OR指令也可以使CF清零,不知道这里必须用XOR吗?它们有什么区别?
用户 昵称 2003-04-13
  • 打赏
  • 举报
回复
扩展可以解决。

21,499

社区成员

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

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