Сборка GNU x86-64 - PullRequest
       34

Сборка GNU x86-64

2 голосов
/ 21 февраля 2012

При расследовании сбоя я наткнулся на следующий фрагмент кода и сразу понял, что инструкция mov должна быть на самом деле movq, чтобы получить правильную операцию 64-разрядного регистра.

#elif defined(__x86_64__)
    unsigned long rbp;
    __asm__ volatile ("mov %%rbp, %0" : "=r" (rbp));
    sp = (void **) rbp;
#else

Далеек этому я также нашел документацию, в которой утверждается, что регистр rbp для x86-64 является универсальным и не содержит адреса текущего кадра.Я также нашел документацию, которая утверждает, что rbp содержит адрес текущего кадра.Может кто-нибудь уточнить?

1 Ответ

7 голосов
/ 21 февраля 2012

Относительно первой части вашего вопроса (movq вместо mov), ассемблер (как, в данном случае), распознает, что ваш операнд 64-битный, и будет правильно использовать movq.mov не является допустимой инструкцией, это способ сказать ассемблеру «использовать правильный mov вариант в зависимости от операндов».

Что касается второй части, то на самом деле это и то и другое: это регистр общего назначенияв том смысле, что он может иметь любое значение.Он также используется как базовый указатель стекового кадра.В разделе «2.4 Работа со стеком» руководства AMD64 «Прикладное программирование» написано:

Стек - это часть сегмента стека в памяти, которая используется для связывания процедур.Программные соглашения обычно определяют стеки, используя кадр стека, который состоит из двух регистров - базового указателя кадра стека (rBP) и указателя стека (rSP) -

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