2015-06-07 3 views
1

Я пытаюсь использовать lea rax, [rip] в программе c. Моя программа выглядит следующим образом:квадратные скобки в встроенном сборе

... 
asm volatile ("lea %%rax, %[rip]" 
      :); 
... 

Однако программа не компилируется, метание ошибки: undefined name operand. Моя платформа Ubuntu 1404 на архитектуре x86-64 (как виртуальная машина).

+1

вы уверены в синтаксисе и порядке операнда назначения/источника? См. Здесь, если вы используете gcc: https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html – Pynchia

+0

не могли бы вы быть более конкретными (с учетом не-эксперта здесь)? Я немного обновил OP, и в отношении инструкции 'lea' следую здесь: http://stackoverflow.com/questions/12397451/why-cant-i-save-the-value-of-rip. – Richard

+0

Я думаю, что встроенная сборка GCC, [] или% [] обозначает именованный параметр, который вы передаете. Rip - это фактически имя машинного регистра, а не имя одного из ваших параметров, поэтому нет смысла ссылаться на него сюда. Вы имели в виду, что это адресный операнд? – sh1

ответ

3

Для использования lea rax, [rip] в встроенной сборке с GCC вам необходимо преобразовать его в AT & T синтаксис и котировку правильно, чтобы символы% не интерпретировались как замены операндов. Так, например:

asm volatile ("lea (%%rip),%%rax" 
      ::: "rax"); 

Обратите внимание, что, так как это на самом деле не делают ничего полезного, у вас нет доступа к значению, сохраненному в RAX в коде C, вы должны указать выходной операнд:

long long ip; 
asm ("lea (%%rip),%0" 
    : "=r" (ip)); 

Это позволит вам получить доступ к значению через переменную ip.

+0

отличный ответ. @Richard: если вы хотите использовать синтаксис Intel, прочитайте здесь: http://stackoverflow.com/questions/5397677/gcc-intel-syntax-inline-assembly – Pynchia

Смежные вопросы