Что именно делает команда с 3 операндами imul в сборке ia-32? - PullRequest
4 голосов
/ 05 октября 2010

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

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

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

Ответы [ 2 ]

10 голосов
/ 05 октября 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-разрядный регистр).

7 голосов
/ 05 октября 2010

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

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

Или:

%ebp + (4 * %ebx) - 44

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

offset(base, index, multiplier)
...