【发布时间】:2018-07-25 11:24:12
【问题描述】:
我有以下装配线:
...
MOV ECX, 0x36EE80
MOV EDX, 0x95217CB1
MUL EDX
SHR EDX, 0x15
MOV DWORD PTR SS:[EBP-0x3C8], EDX
....
....
所以,在http://en.wikibooks.org/wiki/X86_Assembly/Arithmetic 中,我读到 MUL 的操作数(在这种情况下是 EDX)的值与 EAX 中的值相乘。因此,在 EAX 中,我的值为 0330FD3B(十进制:53542203)。在 EDX 中,我的值为 95217CB1(十进制:2501999793)。 但是在 MUL 操作之后,我在 EDX 中有值 01DBEE41(十进制:31190593)。但这一定是错误的,因为 53542203 * 2501999793 不是 31190593...
有人可以解释一下吗?
【问题讨论】:
-
如果这是专门关于 x86 程序集的,你应该这样标记它。
-
当您将 EDX 乘以 EAX 时,结果为
EDX:EAX。0330FD3B*95217CB1是1DBEE41EB22A9CB所以EDX将是1DBEE41而 EAX 将是EB22A9CB形成整个答案。 -
仔细阅读您发布的链接,OP :)
-
看起来这可能是除以一个常数,因为它是如何正确移动结果的高半部分。 Why does GCC use multiplication by a strange number in implementing integer division?