彙編知識


    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保存的地址,並跳轉到這個位置
相關文章
相關標籤/搜索