簡體   English   中英

64-assembly中的Imul

[英]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/m32or reg, r/m32 - 它沒有做任何特別奇怪的事情。

在這個 32 位乘法完全沒有意義之前使用mov rax, imm64mov eax,0xfbc7a1ce會給出完全相同的結果。 imul不會破壞 RBX,因此如果您想稍后讀取它,那么您放入 RBX 的值的高 32 位仍然存在。不過, imul指令沒有影響。)

更好的是, imul eax, ebx, 0xfbc7a1ce可以避免mov

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM