2010-11-29 3 views
6

Алоподтолкнуть локальные переменные

После того как я прочитал о функции и стек из 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 

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

sub esp, 4 ; "allocate" space for the new stack item 
mov [esp], X ; put new stack item value X in 


Почему локальные переменные не толкают в стек, как это:

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 
+0

Вы можете делать это по путям, но будьте осторожны о том, чтобы навести порядок! – 2010-11-29 21:23:11

+0

Является ли sub esp, 4 - mov [esp], 10 не равным mov [ebp-4], 10? – chitech 2010-11-29 21:55:39

ответ

1

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

+0

Thx для объяснения. Снимок предназначен для локальных переменных в функции, а не для параметров для функции. В статье они используют push для параметров для функции, так что меня путают, почему локальные переменные не нажимают как параметры в функции – chitech 2010-11-29 21:37:54

1

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

Смежные вопросы