2014-09-30 4 views
0

32bit, AT & Синтаксис T/GASConfused об leal. Получает ли он доступ к содержимому адреса памяти?

Я немного смущаюсь между тем, что хранится в регистре. Это значение или это адрес?

Скажем, начало нашей функции имеет это в коде.

movl 12(%ebp), %eax //Get i 
leal (%eax,%eax,2), %eax //Compute 3*i 

Так 12 (% ebp) не является значением самого i. Он имеет адрес, где значение i фактически находится в памяти. Таким образом, это означает, что & i отправляется в регистр eax.

Следующая строка Leal. Разве это действительно разыскивает адрес, который находится в eax?

Вот что я думаю, что это делает. Речь идет о загрузке адреса и отправке его в регистр% eax.

Если я следую своему определению, действительно ли он принимает & i в eax и умножает его на 2, а затем снова добавляет? Итак, это & i + & i * 2? Очевидно, что это не так. Если & я был FFFF FFF1 (невозможно, но только пример), он будет вычислять адрес, который находится за пределами моего диапазона памяти.

не должна быть линией ...

movl (%eax,%eax,2), %eax 

где он будет иметь доступ к ячейке памяти, хранящуюся в EAX и посмотреть, что в этом адресе ими память, я мог бы равняться, скажем, 5, к примеру.

(If you wanted to know the rest of the code, here it is. It's about get an array element's address) 
movl 16(%ebp), %edx //Get j 
sall $2, %edx Compute //j*4 
addl 8(%ebp), %edx //ComputexA+4j 
movl (%edx,%eax,4), %eax //Read fromM[xA+4j+12i] 

спасибо.

ответ

0

Значение аргументов мнемоники в целом сильно различается. Вы должны думать аргументы «movl» и аргументы leal по-разному.

movl 12(%ebp), %eax //Get i 

movl означает «переместить длинные данные из местоположения первого аргумента в местоположение второго аргумента». 12 (% ebp) - это место в памяти, которое 12 выше от «базового указателя» (% ebp). Это также местоположение переменной «i» в памяти. Это назначение определяется компилятором и компилятором, выводящим эту информацию в комментарии.

«#eax» - это место регистрации на чипе под названием «топор».

Чтобы собрать их вместе, «movl 12 (% ebp)» означает переместить данные на & i, чтобы зарегистрировать «топор».

leal (%eax,%eax,2), %eax //Compute 3*i 

leal означает «выполняет математическую операцию с первым аргументом и сохраняет результат до местоположения второго аргумента».

(% eax,% eax, 2) означает ('ax' * 2) + 'ax'. («ax» означает значение, сохраненное в регистре «ax»)

В результате значение «ax» умножается на 3. «ax» имеет значение i, поэтому «ax» становится значением i * 3 после выполнения задания.

1

Хотя lea означает «полезный адрес нагрузки», он фактически не выполняет нагрузку. Вместо этого он вычисляет адрес, на который ссылается операнд памяти, и оставляет это значение в регистре назначения. Возможно, его следовало бы назвать «рассчитать эффективный адрес».

В этом случае это просто выражение (ab), используемое для вычисления reg + reg * 2, умноженное на 3. Похоже, что x3 был учтен из умножения на 12 (размер элемента массива, я полагаю), чтобы использовать режимы адресации для более эффективной работы умножения. Это довольно распространенный шаблон в коде x86.