一個簡單C程式的彙編程式碼分析

來源:互聯網
上載者:User

標籤:

幾個重要的寄存器

eip - 用於存放當前所執行的指令地址

esp - 棧(頂)指標寄存器

ebp - 基址(棧底)指標寄存器

簡單的C程式

 1 int g(int x) 2 { 3   return x + 10; 4 } 5  6 int f(int x) 7 { 8   return g(x); 9 }10 11 int main(void)12 {13   return f(7) + 5;14 }

彙編程式碼分析

 1 g: 2  pushl %ebp 3  movl %esp, %ebp 4 ;下面兩條指令的含義是:將傳入的參數7和10相加並儲存在寄存器eax中 5  movl 8(%ebp), %eax 6  addl $10, %eax 7  popl %ebp 8  ret 9 f:10  pushl %ebp11  movl %esp, %ebp12  subl $4, %esp13 ;下面兩句指令的含義是:將參數7儲存到函數f的棧幀中14  movl 8(%ebp), %eax15  movl %eax, (%esp)16  call g17  leave18  ret19 20 main:21  pushl %ebp22  movl %esp, %ebp23  subl $4, %esp24  movl $7, (%esp)25  call f26  addl $5, %eax27  leave28  ret

針對上面的彙編代碼,我們有如下的圖例分析

說明:

  • 在執行call指令時,eip的所指向的指令是addl $5, %eax

  • call 指令等價於,將eip中的地址壓棧儲存,然後將函數f第一條指令(pushl %ebp)的地址放到eip中。

  • pushl、popl、leave、ret和call指令的等價指令如下pushl %eax ;將eax中的值壓棧儲存 <=>subl $4, %espmovl %eax, (%esp)popl %eax         <=>    movl (%esp), %eaxaddl $4, %espcall 0x12345 <=>pushl %eip(*)movl $0x12345, %eip(*)ret ; 將棧頂值彈出放到eip中,此時eip中的值便是將要執行的指令的地址 <=>popl %eip(*)leave ;恢複所調用程式的堆棧< =>movl %ebp, %esppopl %ebpenter ;與leave指令的操作相反<=>pushl %ebpmovl %esp, %ebp

一個簡單C程式的彙編程式碼分析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.