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
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
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
#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
留言