2010-07-21 26 views
5

我剛剛看一個非常簡單的SPARC彙編輸出,我從本C PROGRAMM有:拆解GCC輸出用來做「呼叫0」代替「呼叫功能失調」,但正常工作

int addition_func(int a, int b) 
{ 
    return(a+b); 
} 

void main() 
{ 

int a = 20; 
int b = 19; 
int res;  

res = addition_func(a, b); 
} 

拆卸.text段的:

00000000 <addition_func>: 
0: 81 c3 e0 08  retl 
4: 90 02 00 09  add %o0, %o1, %o0 

00000008 <main>: 
8: 90 10 20 14  mov 0x14, %o0 
c: 92 10 20 13  mov 0x13, %o1 
10: 82 13 c0 00  mov %o7, %g1 
14: 40 00 00 00  call 14 <main+0xc> 
18: 9e 10 40 00  mov %g1, %o7 
1c: 01 00 00 00  nop 

我不明白爲什麼 「呼叫」 說明書上說:

call 14 <main+0xc> 

爲什麼不:

call 0 <addition_func+0x0> 

程序工作正常,但是,該輸出將不會做出太大的意義 給我。任何建議爲什麼這樣處理?

感謝

+0

可以使用更具描述性的主題.... – 2010-07-21 15:05:36

回答

5

我會假設你使用GCC,但其他的編譯器/彙編器應該具有同等的選擇。

這不是裝配輸出;這是反彙編。如果你想輸入彙編器,使用gcc -S

值得注意數量不是14 - 指令是一個相對地址 0的呼叫:

14: 40 00 00 00  call 14 <main+0xc> 

如果你正在拆卸與-ffunction-sections編譯的目標文件,然後指令是一個簡單的佔位符由鏈接器修復。鏈接器將使用實際的偏移量填充到addition_func;如果你轉儲重定位表,你可能會看到這個。

+0

好的,所以鏈接器修復了這個地址問題。我會進一步研究這個問題,它不完全清楚爲什麼它看起來像它看起來 – Markus 2010-07-21 15:19:43

+0

這不是問題;這是設計。 – 2010-07-21 17:30:17