callq 命令参数的含义是什么?
What are the meanings of callq command parameters?
我知道 callq
指令的作用; 中对其进行了描述。该指令应该有一个参数,应该是调用函数的地址。
但是,在反汇编目标文件时,我看到以下行显示了一条 callq
指令,其中包含两个值而不是一个参数:
1e: e8 00 00 00 00 callq 23 <main+0x19>
我假设23
是return地址,<main+0x19>
是要调用函数的地址。但是,调用的函数不在地址 main+0x19
.
callq
指令的反汇编中显示的23
和main+0x19
两个值是什么意思?
原始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 [=12=]x10,%rsp
12: c7 45 fc 03 00 00 00 movl [=12=]x3,-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 [=12=]x0,%eax
28: c9 leaveq
29: c3 retq
callq 指令只有一个操作数,而不是问题中暗示的两个。反汇编器以两种形式显示它,作为地址和作为符号 + 偏移量。
您正在查看 未链接 目标文件的反汇编。由于正在反汇编的文件没有链接,因此显示的目标地址不是 fun
的地址。汇编器将0放在指令的操作数域中,并为链接器创建重定位记录,以填充到目标最终地址的偏移量。
调用指令的操作数是一个偏移量,相对于调用后下一条指令的地址。因此,操作数字段中的值 0 会导致反汇编程序将下一条指令的地址显示为调用的目标。在所示的反汇编中,地址为 23.
如果您将 fun
设为静态函数,汇编程序可能会填入该函数的真实偏移量,因为它不需要重定位,您会在反汇编中看到它。 (这可能取决于您使用的具体工具和选项。)
如果您反汇编 链接 可执行文件,反汇编程序将显示调用的真实目标地址。
我知道 callq
指令的作用;
但是,在反汇编目标文件时,我看到以下行显示了一条 callq
指令,其中包含两个值而不是一个参数:
1e: e8 00 00 00 00 callq 23 <main+0x19>
我假设23
是return地址,<main+0x19>
是要调用函数的地址。但是,调用的函数不在地址 main+0x19
.
callq
指令的反汇编中显示的23
和main+0x19
两个值是什么意思?
原始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 [=12=]x10,%rsp
12: c7 45 fc 03 00 00 00 movl [=12=]x3,-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 [=12=]x0,%eax
28: c9 leaveq
29: c3 retq
callq 指令只有一个操作数,而不是问题中暗示的两个。反汇编器以两种形式显示它,作为地址和作为符号 + 偏移量。
您正在查看 未链接 目标文件的反汇编。由于正在反汇编的文件没有链接,因此显示的目标地址不是 fun
的地址。汇编器将0放在指令的操作数域中,并为链接器创建重定位记录,以填充到目标最终地址的偏移量。
调用指令的操作数是一个偏移量,相对于调用后下一条指令的地址。因此,操作数字段中的值 0 会导致反汇编程序将下一条指令的地址显示为调用的目标。在所示的反汇编中,地址为 23.
如果您将 fun
设为静态函数,汇编程序可能会填入该函数的真实偏移量,因为它不需要重定位,您会在反汇编中看到它。 (这可能取决于您使用的具体工具和选项。)
如果您反汇编 链接 可执行文件,反汇编程序将显示调用的真实目标地址。