Как инструкция CALL разбирается в hex? - PullRequest
0 голосов
/ 20 ноября 2018

Я написал простой 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Большое спасибо.

1 Ответ

0 голосов
/ 20 ноября 2018

Если вы посмотрите на эту инструкцию , вы увидите, что код операции E8 для call имеет два возможных операнда, rel16 и rel32, которые означают относительное смещение адреса16 или 32 бита от следующего указателя инструкции.d8 ff ff ff, если интерпретировать его как 32-битное значение дополнения до двух, сохраненное в младшем порядке, относительное смещение 0xFFFFFFD8, равное -40, поэтому инструкция call вызывает код, начинающийся -40байтов до конца самой инструкции call как функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...