Имуль в 64 сборке - PullRequest
       0

Имуль в 64 сборке

0 голосов
/ 08 января 2020

У меня есть этот код:

mov rax, 0x93f3ffc2fbc7a1ce
mov rbx, 0x5862d8a05a385cbe
imul eax, ebx

Как работает imul для 64-битной сборки? Будет ли переполнение aex записываться в первые 32 бита rax?

1 Ответ

3 голосов
/ 08 января 2020

Ваш код собирает в

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.

...