Assmeble code of "for loop" with gcc -- C

References:
1. http://www.cs.mun.ca/~rod/winter2004/cs3724/notes/asm.html
2. http://www.hep.wisc.edu/~pinghc/x86AssmTutorial.htm

OS  : Ubuntu 13.04 x86_64
GCC: version 4.7.3 (Ubuntu/Linaro 4.7.3-1ubuntu1)

最近想說剛好有空閒的時間就想把以前所學的C語言到底經過GCC編譯後的Assemble到底
長的如何?所以我先看了for loop到底編譯後會長怎樣,以下是我的C code他是個很簡單的
for loop ,然後利用以下兩個指令來產生Assemble code來看。

1. gcc -Wall -O0 for.c -o assemble
2. objdump -d --no-show-raw-insn assemble  > for_0.txt

題外話寫C code的時候,其實真的要對每一個語法到底經過GCC編譯後會變成怎樣,到底產
生的assemble對於你的平台是不是最好的結果來去深入理解。當然你是要把每個語法都看完
還滿難的而且還是要有空閒時間或是工作不忙的時候看 XD

以下的說明如果有錯誤請糾正我,謝謝 ^__^

C code

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>                                                              
                                                                                 
int main(int argc, const char *argv[])                                          
{                                                                               
    int i = 0, c = 10;                                                          
    for (i = 5; i < 10; i++) {                                                  
        c += i;                                                                 
    }                                                                           
    return 0;                                                                   
}  

Assemble

116 00000000004004ec <main>:
117   4004ec:   push   %rbp 
118   4004ed:   mov    %rsp,%rbp   
119   4004f0:   mov    %edi,-0x14(%rbp)                
120   4004f3:   mov    %rsi,-0x20(%rbp)                         
121   4004f7:   movl   $0x0,-0x8(%rbp)     i = 0

122   4004fe:   movl   $0xa,-0x4(%rbp)     c = 10 (0xa)
123   400505:   movl   $0x5,-0x8(%rbp)     for對i初始化 i = 5
124   40050c:   jmp    400518 <main+0x2c>  跳到400518的位置(main+0x2c)
125   40050e:   mov    -0x8(%rbp),%eax     eax = i (要做運算所以將i的值放到eax)             
126   400511:   add    %eax,-0x4(%rbp)     c = c + i                
127   400514:   addl   $0x1,-0x8(%rbp)     i++ (addl這個指令就是i = i + 1)

128   400518:   cmpl   $0x9,-0x8(%rbp)     i < 10,比對i的資料(參考連結*1)
129   40051c:   jle    40050e <main+0x22如果比對小於或等於就跳到40050e(main+0x22)

130   40051e:   mov    $0x0,%eax               
131   400523:   pop    %rbp                
132   400524:   retq                            
133   400525:   nopw   %cs:0x0(%rax,%rax,1)

134   40052f:   nop  

留言

熱門文章