Как я могу переместить адрес метки в регистр - PullRequest
2 голосов
/ 02 ноября 2011

В встроенной сборке gcc для x86, как мне переместить адрес метки в регистр. Что это должно быть вместо $ label здесь, потому что ассемблер выдает ошибку неопределенная ссылка на метку .

Обратите внимание, что метка находится за пределами блока asm , то есть в пределах нормального кода C.

      __asm__ __volatile__ ("movl $label, %eax;");
label:
      .....

Ответы [ 2 ]

2 голосов
/ 02 ноября 2011

Вы можете сделать:

register unsigned long eax __asm__("eax");  // See [1]
eax = &&label;  // See [2]

label:
  // some code

Однако, будьте осторожны: GCC может свободно переупорядочивать код при оптимизации, и поэтому C label может быть не совсем таким, каким вы его ожидаете.

Если вам нужно точное размещение label (например, из-за того, что какой-то ассемблерный код перейдет к нему), вам лучше будет кодировать все это в сборке.

[1] http://gcc.gnu.org/onlinedocs/gcc/Local-Reg-Vars.html#Local-Reg-Vars

[2] http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html

0 голосов
/ 02 ноября 2011

Я понял, этикетка также должна быть обернута в сборочный блок, как это ...

__asm__ __volatile__ ("label:");
...