нажмите локальные переменные - PullRequest
6 голосов
/ 29 ноября 2010

Alo

После того, как я прочитал о функции и стеке от http://en.wikibooks.org/wiki/X86_Disassembly/Functions_and_Stack_Frames У меня возник вопрос о локальных переменных.

Снимок из статьи:


push ebp     ; save the value of ebp
mov ebp, esp ; ebp now points to the top of the stack
sub esp, 12  ; space allocated on the stack for the local variables

Это означает, что к локальным переменным можно обращаться, ссылаясь на ebp.Рассмотрим следующий фрагмент кода C и соответствующий ассемблерный код:

a = 10;
b = 5;
c = 2;

mov [ebp -  4], 10  ; location of variable a
mov [ebp -  8], 5   ; location of b
mov [ebp - 12], 2   ; location of c

Помните, что pushing делает это в основном::

push 10
push 5
push 2

вместо

sub esp, 12

mov [ebp -  4], 10  ; location of variable a
mov [ebp -  8], 5   ; location of b
mov [ebp - 12], 2   ; location of c

Ответы [ 2 ]

1 голос
/ 30 ноября 2010

На практике, если вы знаете, сколько стекового пространства вам нужно, и резервируете его за одну операцию, вы можете использовать инструкцию mov, которая выполняется быстрее, чем push-immed (особенно теперь, когда для вычисления смещения используется специальное оборудование).Возможно, существует устаревший компонент, связанный с тем, что push immed не стал доступен на x86 до выпуска процессоров 80186/80188.К тому времени конвенция sub / mov стала уже устоявшейся моделью.

1 голос
/ 30 ноября 2010

Это скорее вопрос семантики, а не технической корректности: push и pop используются для сохранения и восстановления регистров или значений;но предоставление локальных переменных для функции не соответствует этой обычной цели push / pop.Итак, стек здесь управляется вручную (кроме push ebp и pop ebp, потому что здесь мы действительно хотим сохранить и восстановить ebp в истинном смысле push / pop).

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