адресация памяти x86 с параметрами функции - PullRequest
4 голосов
/ 22 октября 2011

Так что, если у меня есть процедура, где первый формальный параметр - int[], и я перечисляю этот цикл, я не понимаю, почему один фрагмент кода работает, а другой нет. Я должен быть в состоянии сделать это:

#where ebp+8 is the location of the pointer, and ecx is the counter
mov edx, [ebp+ecx*4+8]

Это дает мне бессмысленное значение для edx, но этот код работает нормально

mov edx, [ebp+8]
mov edx, [edx+ecx*4]

Я не понимаю разницу между этими утверждениями.

1 Ответ

4 голосов
/ 22 октября 2011

Они разные:

В первом коде:

mov edx, [ebp+ecx*4+8]

Вы загружаетесь с адреса: ebp+ecx*4+8

Во втором коде:

mov edx, [ebp+8]
mov edx, [edx+ecx*4]

Сначала вы загружаете значение, хранящееся в ebp+8. Затем вы используете его в качестве базового адреса для второй загрузки.

Другими словами, базовый адрес сохраняется в ячейке памяти, на которую указывает ebp + 8. На самом деле он не сохраняется в самом регистре ebp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...