我写了一个简单的C代码,就像:
int add2(int a) {
return a+2;
}
int main()
{
int a=0;
a = add2(a);
printf("%d\n", a);
}
当我使用objdump时,我发现了这一点:
400558: e8 d8 ff ff ff callq 400535 <add2>
我想知道十六进制代码e8 d8 ff ff ff
和callq 400535 <add2>
之间的关系。我搜索发现callq的十六进制代码为e8
,但是d8 ff ff ff
呢?它和callq呼叫的地址有关系吗?非常感谢。
答案 0 :(得分:5)
如果查看this instruction reference,您将看到E8
的操作码call
有两个可能的操作数rel16
和rel32
,这意味着下一条指令指针的相对地址位移是16位还是32位。将d8 ff ff ff
解释为存储在little-endian中的32位二进制补码值时,其相对位移0xFFFFFFD8
为-40
,因此call
指令为调用-40
指令本身末尾的call
字节开始的代码作为函数。