2010-07-21 18 views
5

ho avuto solo uno sguardo ad una semplice uscita di montaggio SPARC che ho avuto da questo C programma:uscita gcc smontato sembra fare una "chiamata 0" invece di "chiamata di funzione-offset", ma funziona correttamente

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

Smontaggio sezione .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 

non capisco il motivo per cui l'istruzione "chiamare", dice:

call 14 <main+0xc> 

Perché non è vero:

call 0 <addition_func+0x0> 

Il programma funziona bene, però, questa uscita non ha molto senso per me . Qualche suggerimento perché è gestito in questo modo?

Grazie

+0

Potrebbe utilizzare un soggetto più descrittivo .... –

risposta

5

darò per scontato che si sta utilizzando GCC, ma altri compilatori/assemblatori dovrebbero avere opzioni equivalenti.

Questo non è l'output dell'assieme; è lo smontaggio. Se si desidera l'input per l'assemblatore, utilizzare gcc -S.

Il notevole numero non è 14 - l'istruzione è una chiamata a un indirizzo relativo di 0:

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

Se stai smontare un file oggetto compilato con -ffunction-sections, l'operazione è semplicemente un segnaposto da riparare dal linker. Il linker lo inserirà con lo scostamento effettivo a addition_func; potresti vederlo se scarichi le tabelle di rilocazione.

+0

OK, il linker risolve questo problema di indirizzo. Darò un ulteriore sguardo a questo problema, non è del tutto chiaro perché sembra come sembra – Markus

+0

Non è un problema; è di design. –