Ваш код собирает в
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 бита.
В отличие от 1-операндной формы imul
, старшая половина 32x32 => 64-битного полного умножение не записывается в EDX (или где-либо еще, например, в верхнюю половину RAX); это просто отбрасывается или для эффективности даже не рассчитывается. См. документацию ; 2-операнд imul reg, r/m32
подобен add reg, r/m32
или or reg, r/m32
- он не делает никаких особых странных вещей.
Использование mov rax, imm64
до того, как 32-битное умножение совершенно бессмысленно, mov eax,0xfbc7a1ce
даст точно такие же результаты. (imul
не уничтожает RBX, поэтому старшие 32 бита значения, введенного вами в RBX, все еще там, если вы хотите прочитать его позже. Однако это не влияет на инструкцию imul
.)
Еще лучше, imul eax, ebx, 0xfbc7a1ce
мог бы избежать mov
.