汇编语言中的IDIV操作(理解)

6
当我进行这个操作时
IDIV ecx

在汇编语言中,我读到过edx:eax中的值将被除以操作数ecx。我也知道商存储在eax中,余数存储在edx中。
但是,edx:eax中的值到底是什么?
有人能给我解释一下吗?
编辑:我也不明白为什么“cdq”操作总是在IDIV操作之前进行,尽管我已经阅读了一些相关页面。

你应该明确说明你在谈论x86汇编语言,"assembler"是一个通用术语,不特定于任何CPU/指令集。 - Marc B
此外,你的答案已经有文档记录:http://en.wikipedia.org/wiki/X86_instruction_listings#Added_with_80386 - Marc B
R = X/Y。分子X在edx:eax中,分母Y在ECX中。如果要除两个数,您必须提供这两个数,而不仅仅是其中一个。因此,您将分子提供给edx:eax,将分母提供给ecx,进行除法运算并得到结果。 - old_timer
2个回答

5
在这个上下文中,EDX:EAX指的是由寄存器EDXEAX组成的64位值,其中EDX被解释为包含最高有效位,EAX则包含最低有效位。
CDQEAX中的双字转换为EDX:EAX中的四字,通过将EAX符号扩展到EDX中(即EDX的每一位都填充了EAX的最高位)。例如,如果EAX包含0x7FFFFFFF,则在EDX中得到0,因为EAX的最高位是清零的。但如果你有EAX=0x80000000,则会得到EDX=0xFFFFFFFF,因为EAX的最高位被设置了。
CDQ的目的是在32位操作数进行除法运算之前设置好EDX,因为被除数是EDX:EAX

1

这是什么?它是你放置在那里以便进行除法的值...

CDQ指令将EAX中的32位值转换为EDX:EAX中的64位值(通过将EAX的符号位复制到EDX的每个位)。如果要除以的值通常为32位,则使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接