Ассемблер Язык Целочисленные регистры - PullRequest
1 голос
/ 27 февраля 2012

Я не понимаю, что делает эта инструкция по сборке. Каково его влияние и почему?

imull $16, (%eax, %edx,4)

Начальные значения регистров

%eax= 0x100x
%edx= 0x3

Ответы [ 2 ]

9 голосов
/ 27 февраля 2012

Я предполагаю, что вы пытаетесь понять, как интерпретировать эту инструкцию по сборке в стиле AT & T, в частности адресную часть. Я уверен, что вам не нужна помощь в понимании того, что делает часть imull $16 - она ​​просто выполняет умножение со знаком, последнее l означает long слово.

(%eax, %edx, 4) - это форма адресации, где у вас есть базовый адрес, смещение определенного количества элементов и масштаб / множитель для умножения количества элементов на размер каждого: (base, offset, offset scale/multiplier).

В результате вы получите (base + (offset * multiplier), поэтому в этом случае это будет:

(%eax + (%edx * 4))
(0x100 + (0x3 * 4))
(0x100 + 0xC)
(0x10C)

Поэтому инструкция imull $16, (%eax, %edx,4) выполняет умножение со знаком 16 на значение длинного слова по адресу 0x10C.

1 голос
/ 27 февраля 2012

Результатом этой инструкции будет то, что dword будет сохранено по адресу 0x10c, умноженному на 16 (или, по вашему желанию, смещенному влево на 4 бита).Результат будет также записан по этому адресу.

...