1.棧的棧底地址比棧頂地址大,棧頂指針指着的是最新push的數據。 c++
2.舉例說明棧的使用 shell
int func1(int a) { int b = a + 1; return b; } int func0(int a) { int b = func1(a); return b; }
經過如下命令將上述code編程成彙編代碼: 編程
g++ -g -S -O0 -m32 main.cpp -o-|c++filt >main.format.s spa
c++filt 是爲了Demangle symbols。-m32是爲了編譯成x86-32的。 指針
獲得func0的彙編代碼: code
func0(int): pushl %ebp #保存先前的棧底地址,而且使棧 #頂地址加4,指向保存的棧底地址 movl %esp, %ebp #設置新的棧底地址,使其等於當前的棧頂地址 subl $20, %esp #預留20個字節用來定義局部變量 movl 8(%ebp), %eax movl %eax, (%esp) call func1(int) movl %eax, -4(%ebp) #將func1的結果存在當前棧中 movl -4(%ebp), %eax #返回b leave #1.將棧頂指針賦值給棧底指針2.pop出舊的地址, #同時因爲pop,棧底指針+4,則棧頂指針和棧底指針徹底變成原來的值 ret #彈出call保存的地址,並跳轉到這個位置