一段簡單c程式的組合語言學習(ubuntu+x86)

來源:互聯網
上載者:User

c程式碼:

#include <stdio.h>int main(void){int i=0, j=0;for(i=0; i<8; i++)j=j+1;return 0;}

彙編代碼如下:

.file   "test_asm.c"      2     .text      3     .globl  main      4     .type   main, @function      5 main:      6 .LFB0:      7     .cfi_startproc      8     pushl   %ebp      9     .cfi_def_cfa_offset 8     10     .cfi_offset 5, -8     11     movl    %esp, %ebp     12     .cfi_def_cfa_register 5     13     subl    $16, %esp     14     movl    $0, -8(%ebp)     15     movl    $0, -4(%ebp)     16     movl    $0, -8(%ebp)     17     jmp .L2     18 .L3:     19     addl    $1, -4(%ebp)     20     addl    $1, -8(%ebp)     21 .L2:     22     cmpl    $7, -8(%ebp)     23     jle .L3     24     movl    $0, %eax     25     leave     26     .cfi_restore 5     27     .cfi_def_cfa 4, 4     28     ret     29     .cfi_endproc     30 .LFE0:     31     .size   main, .-main     32     .ident  "GCC: (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3"     33     .section    .note.GNU-stack,"",@progbits

彙編代碼講解:

第8行:將棧基址指標(存在ebp寄存器)推入棧
第11行:將棧指標移入基址指標(esp為基底位址暫存器)

第13行:從ebp開始分配16位元組的記憶體

第14,15,16行:將i, j賦初值0

第17行:.L2為編譯器建立的標號,並跳到.L2執行

第22,23行:將i的與常量7比較,成立則跳到.L3執行

第18行:將j的值加1,i的值加1

最後幾行釋放局部記憶體區,並跳回調用程式(ret)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.