需要帮助了解程序集与堆栈的交互

时间:2011-09-22 02:10:57

标签: gcc assembly x86

好的,所以这是交易。根据我的理解,你可以用汇编中的堆栈来做这样的事情:

push 5
push 6

好的,现在我们在堆栈上:6                                    5

所以

pop eax

将6放入eax正确吗?但是,如果我们希望在6或5之前将5或某些值压入堆栈,我们将如何抓住它? (没有弹出顶部值)

我看了这个:How does the stack work in assembly language? 而且似乎你无法根据汇编中的堆栈中的地址访问内容。然而,这对我来说似乎没有多大意义。或者有没有办法迭代堆栈而不会“弹出”顶部的东西。谢谢,抱歉“愚蠢”的问题!

2 个答案:

答案 0 :(得分:1)

堆栈就像其他任何内存一样。 ESP寄存器指向堆栈的当前顶部(堆栈在内存中向下增长,因此push指令将减少 ESP寄存器。)

您可以通过从寄存器索引来访问堆栈上的特定值:

mov ebp,esp
mov eax,[ebp+4]

(如果我没记错的话,你不能直接使用ESP的偏移寻址模式,但你可以使用EBP。)

答案 1 :(得分:0)

堆栈指针(由pushpop操纵)只是一个寄存器; esp。您可以偏移该寄存器以访问相对于当前堆栈顶部的内容。