Я знаю, что делает инструкция callq
; это описано в этом ответе . Инструкция должна иметь один параметр, который должен быть адресом вызываемой функции.
Однако при разборке объектного файла я вижу следующую строку, показывающую инструкцию callq
с двумя значениями вместо одного параметра:
1e: e8 00 00 00 00 callq 23 <main+0x19>
Я предполагаю, что 23
- это адрес возврата, а <main+0x19>
- это адрес вызываемой функции. Однако вызываемая функция не находится по адресу main+0x19
.
Что означают два значения 23
и main+0x19
, показанные в разборке инструкции callq
?
Оригинальный код C:
#include <stdio.h>
void fun(int a)
{
}
int main()
{
int a = 1234;
fun(a);
}
objdump -D main.o main.asm
Разъединенный код:
0000000000000000 <fun>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 89 7d fc mov %edi,-0x4(%rbp)
7: 90 nop
8: 5d pop %rbp
9: c3 retq
000000000000000a <main>:
a: 55 push %rbp
b: 48 89 e5 mov %rsp,%rbp
e: 48 83 ec 10 sub $0x10,%rsp
12: c7 45 fc 03 00 00 00 movl $0x3,-0x4(%rbp)
19: 8b 45 fc mov -0x4(%rbp),%eax
1c: 89 c7 mov %eax,%edi
1e: e8 00 00 00 00 callq 23 <main+0x19>
23: b8 00 00 00 00 mov $0x0,%eax
28: c9 leaveq
29: c3 retq