【发布时间】:2016-09-23 10:52:36
【问题描述】:
我还不太清楚 x86 汇编中除法的工作原理(GAS AT&T 语法)。我想做的是将两个长整数相除,然后将商与除数相乘,看看新数是否等于初始数(n/m * m = n)。
movl %ebx, %eax
movl %ecx, %edx
idivl %edx
imull %ebx, %edx
cmp %edx, %ebx
je .equal
上面的代码是我做除法的sn-p。 ebx 和 ecx 是我要除的两个计数器,将 eax 寄存器用作除数是否正确?所以当我写 idivl %edx 时,我将 edx 与 eax 相除,我得到最接近 0 的整数?比如 7/2 = 3?我读过一个地方,商存储在 edx 寄存器中,余数存储在 ah 寄存器中,但我也被告知商存储在 eax 寄存器中,余数存储在 edx 寄存器中,这让我感到困惑。
虽然这里的主要问题是:我想将 ebx 寄存器的值除以 ecx 寄存器的值,我应该如何进行?
谢谢!
编辑:上面的代码产生一个浮点异常
【问题讨论】:
-
如果你想查看
n/m*m == n那么n % m == 0就足够了 -
当然,我没想过,谢谢@LưuVĩnhPhúc 但是,我在哪里可以找到余数/模数?
-
“我在哪里可以找到余数/模数?” 与任何其他 x86 指令相同的位置:在 英特尔® 64 和 IA-32 架构软件开发人员手册中
-
让我为您搜索一下 - 好的,x86.renejeschke.de/html/file_module_x86_id_137.html - 被除数在
%edx:%eax(一个 64 位值)中,除数是操作数(使用%edx似乎是个坏主意,因为它构成股息的一部分),商转到%eax,余数转到%edx。 -
顺便说一句“上面的代码产生了一个浮点异常”我对此表示怀疑,该代码中没有浮点指令。