2012-02-27 4 views
1

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

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

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

%eax= 0x100x 
%edx= 0x3 
+1

Как бы я решил? Я не вижу проблемы в первую очередь. Вы спрашиваете, каков будет результат? – Flexo

ответ

1

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

+0

как вы нашли адрес 0x10c – Raj

+0

этот wat я сделал 0x3 + 4 = 0x7, то 0x7 + 0x100 =? это где я смущен – Raj

9

Я предполагаю, что вы пытаетесь понять, как интерпретировать инструкцию по сборке стилей 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.