Что именно делает инструкция imul с 3 операндами в сборке ia-32?

я читаю инструкцию

imul 0xffffffd4(%ebp, %ebx, 4), %eax

и я озадачен тем, что именно он делает. Я понимаю, что imul умножается, но не могу понять синтаксис.


person Rowhawn    schedule 04.10.2010    source источник


Ответы (2)


Ура синтаксис базы/индекса сборки AT&T! Это вовсе не 3-операндное умножение. Это тот же 2-операнд, который вы знаете и любите, просто первый немного сложнее. Это означает:

%ebp + (4 * %ebx) + 0xffffffd4

Or:

%ebp + (4 * %ebx) - 44

Чтобы быть немного яснее (и в базе 10). Синтаксис базы/индекса AT&T разбивается на:

offset(base, index, multiplier)
person Carl Norum    schedule 05.10.2010
comment
+1, и инструкция умножает значение в eax на (вероятно) целое число в локальном массиве. - person Zooba; 05.10.2010

(Я знаю и предпочитаю синтаксис Intel/MASM, поэтому буду использовать его. Обратите внимание, что порядок операндов отличается от AT&T.)

Ваша инструкция на самом деле состоит из двух операндов imul, что в синтаксисе Intel:

imul eax, DWORD PTR [ebp + ebx*4 + 0FFFFFFD4h]

Где eax — операнд назначения, а ячейка памяти — операнд-источник. Два операнда imul выполняют знаковое (дополнение до двух) умножение исходного и целевого операндов и сохраняет результат в целевом.

Эта инструкция умножает регистр на целое число в массиве. Скорее всего, это появляется в цикле, а массив является локальной переменной.


Инструкция с тремя операндами imul:

imul dest, source1, source2

Операнд source1 (ячейка памяти или регистр) умножается на операнд source2 (8-битное или 16/32-битное целое), и результат сохраняется в операнде dest (16-, 32- или 64-битном). регистр).

person Zooba    schedule 05.10.2010
comment
(Я ответил на оба вопроса для людей, которые попали сюда, выполнив поиск по названию.) - person Zooba; 05.10.2010