Разобранный вывод gcc, кажется, делает «вызов 0» вместо «вызова функции-смещения», но работает правильно - PullRequest
5 голосов
/ 21 июля 2010

Я только что посмотрел на очень простой вывод сборки SPARC, полученный из этой программы на C:

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" написано:

  call  14 <main+0xc>

Почему это не так:

  call  0 <addition_func+0x0>

Программа работает нормально, однако этот вывод не имеет особого смысла мне. Любые предложения, почему это обрабатывается таким образом?

Спасибо

1 Ответ

5 голосов
/ 21 июля 2010

Я предполагаю, что вы используете GCC, но другие компиляторы / ассемблеры должны иметь эквивалентные опции.

Это не сборочный вывод; это разборка. Если вы хотите ввод в ассемблер, используйте gcc -S.

Известный номер не 14 - инструкция является вызовом относительного адреса из 0:

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

Если вы разбираете объектный файл, скомпилированный с -ffunction-sections, то инструкция - это просто заполнитель, который должен быть исправлен компоновщиком. Компоновщик заполнит его фактическим смещением addition_func; Вы можете увидеть это, если сбросите таблицы перемещений.

...