2013-02-19 2 views
4

C++Что такое представление на уровне сборки pushl/popl% esp?

ATT Ассамблея

Я пытаюсь понять поведение двух следующих инструкций:

pushl %esp 

И:

popl %esp 

Обратите внимание, что они сохранить вычисленное значение обратно в %esp.

Я рассматриваю эти инструкции самостоятельно, а не последовательно. Я знаю, что значение, хранящееся в %esp, всегда является значением перед приращением/декрементом, но как я могу представить поведение на языке ассемблера? Это то, что я придумал до сих пор:

Для толчке:

movl %esp, %edx  1. save value of %esp 
subl $4, %esp  2. decrement stack pointer 
movl %edx, (%esp) 3. store old value of %esp on top of stack 

Для поп-музыки:

movl (%esp), %esp You wouldn’t need the increment portion. 

Правильно ли это? Если нет, то где я иду не так? Благодарю.

+0

Я кодирования в x86 ассемблере на протяжении десятилетий. У меня никогда не было случая использовать их. Я уверен, что они определены, но действительно ли это имеет значение на практике? –

+0

Нет, в моем учебнике упоминается, что он никогда не используется на практике, но это хорошее упражнение, чтобы понять соглашение об обучении. – amorimluc

+4

Может быть. Но я бы потратил свое время на размышления о инструкциях типа «введите», «оставить», «cmpsd», «lea», все из которых делают довольно странные вещи, которые очень полезны при правильных обстоятельствах. –

ответ

7

Как говорит о push esp в Intel® 64 and IA-32 Architectures Developer's Manual: Combined Volumes:

The PUSH ESP instruction pushes the value of the ESP register as it existed 
before the instruction was executed. If a PUSH instruction uses a memory operand 
in which the ESP register is used for computing the operand address, the address 
of the operand is computed before the ESP register is decremented. 

И в отношении к pop esp:

The POP ESP instruction increments the stack pointer (ESP) before data at the old 
top of stack is written into the destination. 
+0

Хорошо, спасибо nrz. Не могли бы вы сказать, что поведение сборки, которое я написал, является правильным? – amorimluc

+0

@amorimluc Ваш код выглядит правильно для меня, так как он соответствует документации Intel. – nrz