[英]Imul in 64-assembly
我有这个代码:
mov rax, 0x93f3ffc2fbc7a1ce
mov rbx, 0x5862d8a05a385cbe
imul eax, ebx
imul 如何用于 64 位程序集? 溢出 aex 会写在 rax 的前 32 位吗?
你的代码组装成
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
它对imul
使用操作码0F AF
。 该指令具有 32 位操作数大小,因此它只读取 EAX 和 EBX,并且只写入 EAX。 这隐式地零扩展到 RAX ,将高 32 位清零。
与imul
的 1 操作数形式imul
,32x32 => 64 位全乘法的高半部分不会写入 EDX(或其他任何地方,如 RAX 的高半部分); 它只是被丢弃或根本没有计算效率。 请参阅文档; 2-operand imul reg, r/m32
就像add reg, r/m32
或or reg, r/m32
- 它没有做任何特别奇怪的事情。
在这个 32 位乘法完全没有意义之前使用mov rax, imm64
, mov eax,0xfbc7a1ce
会给出完全相同的结果。 ( imul
不会破坏 RBX,因此如果您想稍后读取它,那么您放入 RBX 的值的高 32 位仍然存在。不过, imul
指令没有影响。)
更好的是, imul eax, ebx, 0xfbc7a1ce
可以避免mov
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.