2010-07-21 14 views
5

miałem tylko spojrzeć na bardzo prosty montażowej SPARC, że mam z tego C programowo:Zdemontowane wyjście gcc wydaje się zrobić „call 0” zamiast „funkcją offsetu rozmowy”, ale działa poprawnie

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); 
} 

Demontaż sekcji .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 

nie rozumiem dlaczego dyspozycja "call", mówi:

call 14 <main+0xc> 

Dlaczego go nie:

call 0 <addition_func+0x0> 

Program działa dobrze, jednak wynik ten nie robi zbyt wielkiego sensu do mnie. Wszelkie sugestie, dlaczego jest obsługiwane w ten sposób?

Dzięki

+0

Może użyć bardziej opisowego tematu .... –

Odpowiedz

5

będę zakładać używasz GCC, ale inne kompilatory/monterzy powinni mieć równoważne opcje.

To nie jest wynik montażu; to jest demontaż. Jeśli chcesz wprowadzić dane do asemblera, użyj gcc -S.

Liczba zauważalną nie jest 14 - instrukcja jest wezwaniem do względnego adresu 0:

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

Jeśli demontażu plik obiektowy skompilowany z -ffunction-sections, wówczas instrukcja jest po prostu symbol zastępczy, który ma zostać naprawiony przez linker. Łącznik wypełni go rzeczywistym przesunięciem do addition_func; możesz to zobaczyć, jeśli zrzucisz tabele relokacji.

+0

Dobrze, więc linker rozwiązuje ten problem z adresem. Będę się dalej zajmował tą kwestią, nie do końca wyjaśnię, dlaczego wygląda tak, jak wygląda – Markus

+0

To nie problem; to jest zgodne z projektem. –