2010-07-21 2 views
5

je devais juste jeter un oeil à une très simple sortie de montage SPARC que je suis arrivé de ce programm C:sortie gcc Démonté semble faire un « appel 0 » au lieu de « fonction offset appel », mais fonctionne correctement

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

désassemblage de l'article .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 

Je ne comprends pas pourquoi l'instruction "appel" dit:

call 14 <main+0xc> 

Pourquoi est-il pas:

call 0 <addition_func+0x0> 

Le programme fonctionne très bien, cependant, cette sortie ne fait pas trop de sens pour moi. Des suggestions pour lesquelles il est géré de cette façon?

Merci

+0

Pourrait utiliser un sujet plus descriptif .... –

Répondre

5

Je suppose que vous utilisez GCC, mais d'autres compilateurs/assembleurs devraient avoir des options équivalentes.

Ce n'est pas la sortie d'assemblage; c'est le démontage. Si vous voulez l'entrée à l'assembleur, utilisez gcc -S.

Le nombre notable n'est pas 14 - l'instruction est un appel à une adresse relative 0:

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

Si vous désassembler un fichier objet compilé avec -ffunction-sections, l'instruction est tout simplement une espace réservé à être fixé par l'éditeur de liens. L'éditeur de liens le remplira avec le décalage réel à addition_func; vous pourriez le voir si vous vider les tables de relocalisation.

+0

D'accord, l'éditeur de liens résout ce problème d'adresse. Je vais examiner de plus près ce problème, il n'est pas tout à fait clair pourquoi il ressemble à ce qu'il a l'air – Markus

+0

Ce n'est pas un problème; c'est par conception. –