注册 登录
编程论坛 汇编论坛

[求助]Win32汇编下div和idiv的具体用法

彭现陈 发布于 2007-08-04 23:08, 7072 次点击

哪位高手请详细讲解一下Win32ASM中除法指令的用法,做除法时各个寄存器的用途.
谢谢了.

20 回复
#2
菜鸟上路2007-08-04 23:41
书上不是有具体说明吗
#3
彭现陈2007-08-04 23:45
回复:(菜鸟上路)书上不是有具体说明吗

我在网上找了半天找不到.能不能把你书上说的发来给我看看啊.
我实在想不起来这个指令是怎么安排各个寄存器的了.

#4
无理取闹2007-08-05 08:05

DIV,无符号数的除法指令,和8086一样,指令给出一个操作数,被除数已默认。如果指令中给出的操作数为32,那么被除数将是EDX:EAX, 最终的商将存放在EAX, 余数将存放在EDX中。如果指令给出操作数为16位,那么被除数为EAX,最终得到的商放在AX,余数放在EAX的高16位。如果指令中给出的操作数为8位,那么被除数是16位,最终得到的商将放在AL中,余数放在AH中。

IDIV,有符号数的除法指令,用法和8086相同,不过支持32位操作

#5
彭现陈2007-08-05 18:44
回复:(无理取闹)DIV,无符号数的除法指令,和8086一...
好,这下全明白了.谢谢啦.
#6
I喜欢c2007-08-05 18:53
...........
#7
zhulei19782007-08-08 20:30
。。。。。
#8
hkbyest2007-08-11 17:30
如果指令给出操作数为16位,那么被除数为EAX,最终得到的商放在AX,余数放在EAX的高16位。

这句是错的吧,被除数是dx:ax,商放ax,余数放dx
#9
hkbyest2007-08-11 17:32
补充一下,idiv的格式与div相同,不过要注意符号扩展的问题!
#10
无理取闹2007-08-11 21:24
以下是引用hkbyest在2007-8-11 17:30:44的发言:
如果指令给出操作数为16位,那么被除数为EAX,最终得到的商放在AX,余数放在EAX的高16位。

这句是错的吧,被除数是dx:ax,商放ax,余数放dx

你看好应该是32汇编哦 不是8086汇编

#11
hkbyest2007-08-11 21:47
一样的,版主能说一下你上面所讲的内容出自哪里么?我的确不知道。

[此贴子已经被作者于2007-8-11 21:55:38编辑过]


#12
无理取闹2007-08-11 22:30
只有本站会员才能查看附件,请 登录

#13
无理取闹2007-08-11 22:31
摘自上面文档
#14
hkbyest2007-08-12 17:47

看了,那个说法肯定是错误的,建议找一些比较正规的书籍教材来学习为好。

[QUOTE]
DIV INSTRUCTION
Purpose: Division without sign.

Syntax:
DIV source

The divider can be a byte or a word and it is the operator which is given the instruction.

If the divider is 8 bits, the 16 bits AX register is taken as dividend and if the divider is 16 bits the even DX:AX register will be taken as dividend, taking the DX high word and AX as the low.

If the divider was a byte then the quotient will be stored on the AL register and the residue on AH, if it was a word then the quotient is stored on AX and the residue on DX.

IDIV INSTRUCTION

Purpose: Division with sign.

Syntax:

IDIV source

It basically consists on the same as the DIV instruction, and the only difference is that this one performs the operation with sign.For its results it used the same registers as the DIV instruction.[/QUOTE]

这是intel开发手册上的内容,应该够权威了。

#15
无理取闹2007-08-12 17:56
写个程序测试一下不就得了  我一会去试试
#16
无理取闹2007-08-12 18:20
看来你说的没错 我写程序测试了一下 他那个文档上面说的确实是错的 hkbyest好厉害啊
唉 真是误人子弟

[此贴子已经被作者于2007-8-12 18:21:52编辑过]

#17
无理取闹2007-08-12 18:25

DIV,无符号数的除法指令,和8086一样,指令给出一个操作数,被除数已默认。如果指令中给出的操作数为32,那么被除数将是EDX:EAX, 最终的商将存放在EAX, 余数将存放在EDX中。如果指令给出操作数为16位,那么被除数为EAX,最终得到的商放在AX,余数放在DX。如果指令中给出的操作数为8位,那么被除数是16位,最终得到的商将放在AL中,余数放在DL中。

这回对了吧 hkbyest检查一下

#18
hkbyest2007-08-13 22:52
以下是引用无理取闹在2007-8-12 17:56:23的发言:
写个程序测试一下不就得了 我一会去试试



记得先清eax哦
这类代码我写过许多了,不会骗你的,^_^



哎呀,原来你已经测试了啊,没注意看,汗~ 上面当废话吧

[此贴子已经被作者于2007-8-13 22:55:27编辑过]

#19
hkbyest2007-08-13 22:58
[QUOTE]DIV,无符号数的除法指令,和8086一样,指令给出一个操作数,被除数已默认。如果指令中给出的操作数为32,那么被除数将是EDX:EAX, 最终的商将存放在EAX, 余数将存放在EDX中。如果指令给出操作数为16位,那么被除数为EAX,最终得到的商放在AX,余数放在DX。如果指令中给出的操作数为8位,那么被除数是16位,最终得到的商将放在AL中,余数放在DL中。[/QUOTE]

还是错了~你看的那资料只是有关16位除法那有错而已,我修改一下吧

DIV,无符号数的除法指令,和8086一样,指令给出一个操作数,被除数已默认。如果指令中给出的操作数为32位,那么被除数将是EDX:EAX, 最终的商将存放在EAX, 余数将存放在EDX中。如果指令给出操作数为16位,那么被除数为DX:AX,最终得到的商放在AX,余数放在DX。如果指令中给出的操作数为8位,那么被除数是AX,最终得到的商将放在AL中,余数放在AH中。
#20
hkbyest2007-08-13 23:00
我也是初学者,大家一起进步嘛
#21
无理取闹2007-08-14 01:52
学习了
1