[英]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.