如何将CALL指令解析为十六进制?

时间:2018-11-20 14:57:50

标签: c assembly x86

我写了一个简单的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 ffcallq 400535 <add2>之间的关系。我搜索发现callq的十六进制代码为e8,但是d8 ff ff ff呢?它和callq呼叫的地址有关系吗?非常感谢。

1 个答案:

答案 0 :(得分:5)

如果查看this instruction reference,您将看到E8的操作码call有两个可能的操作数rel16rel32,这意味着下一条指令指针的相对地址位移是16位还是32位。将d8 ff ff ff解释为存储在little-endian中的32位二进制补码值时,其相对位移0xFFFFFFD8-40,因此call指令为调用-40指令本身末尾的call字节开始的代码作为函数。