问题描述
我有这个代码:
mov rax, 0x93f3ffc2fbc7a1ce
mov rbx, 0x5862d8a05a385cbe
imul eax, ebx
imul 如何在 64 位汇编中工作?溢出的 aex 会写在 rax 的前 32 位吗?
How does imul work for 64-bit assembly? Will the overflow aex be written in the first 32 bits of rax?
推荐答案
你的代码 assembles 到
0: 48 b8 ce a1 c7 fb c2 movabs rax,0x93f3ffc2fbc7a1ce
7: ff f3 93
a: 48 bb be 5c 38 5a a0 movabs rbx,0x5862d8a05a385cbe
11: d8 62 58
14: 0f af c3 imul eax,ebx
使用操作码 0F AF
作为 imul
.该指令具有 32 位操作数大小,因此它只读取 EAX 和 EBX,并且只写入 EAX.这隐式零扩展到 RAX,将高 32 位清零.
which uses the opcode 0F AF
for imul
. This instruction has 32-bit operand size so it only read EAX and EBX, and only writes EAX. This implicitly zero-extends into RAX, zeroing the upper 32 bits.
与 imul
的 1 操作数形式不同,32x32 => 64 位全乘法的高半部分不会写入 EDX(或其他任何地方,如 RAX 的高半部分);它只是被丢弃或根本没有计算效率.请参阅文档;2 操作数 imul reg, r/m32
就像 add reg, r/m32
或 or reg, r/m32
- 它没有不要做任何特别奇怪的事情.
Unlike the 1-operand form of imul
, the high-half of the 32x32 => 64-bit full multiply isn't written to EDX (or anywhere else like the high half of RAX); it's simply discarded or for efficiency not even calculated at all. See the documentation; 2-operand imul reg, r/m32
is just like add reg, r/m32
or or reg, r/m32
- it doesn't do any special weird stuff.
在这个 32 位乘法完全没有意义之前使用 mov rax, imm64
,mov eax,0xfbc7a1ce
将给出完全相同的结果.(imul
不会破坏 RBX,所以你放入 RBX 的值的高 32 位仍然存在,如果你以后想读取它.它对 imul
指令,虽然.)
Using mov rax, imm64
before this 32-bit multiply is completely pointless, mov eax,0xfbc7a1ce
would give exactly identical results. (The imul
doesn't destroy RBX, so the upper 32 bits of the value you put into RBX is still there if you want to read it later. It has no effect on the imul
instruction, though.)
更好的是,imul eax, ebx, 0xfbc7a1ce
本来可以避免 mov
.
Even better, imul eax, ebx, 0xfbc7a1ce
could have avoided a mov
.
这篇关于64-assembly中的Imul的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!