я читаю инструкцию
imul 0xffffffd4(%ebp, %ebx, 4), %eax
и я озадачен тем, что именно он делает. Я понимаю, что imul умножается, но не могу понять синтаксис.
я читаю инструкцию
imul 0xffffffd4(%ebp, %ebx, 4), %eax
и я озадачен тем, что именно он делает. Я понимаю, что imul умножается, но не могу понять синтаксис.
Ура синтаксис базы/индекса сборки AT&T! Это вовсе не 3-операндное умножение. Это тот же 2-операнд, который вы знаете и любите, просто первый немного сложнее. Это означает:
%ebp + (4 * %ebx) + 0xffffffd4
Or:
%ebp + (4 * %ebx) - 44
Чтобы быть немного яснее (и в базе 10). Синтаксис базы/индекса AT&T разбивается на:
offset(base, index, multiplier)
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-битном). регистр).