Динамические метки в x86 Ассемблере - PullRequest
1 голос
/ 27 мая 2009

И снова я столкнулся с проблемой, когда не могу найти простое решение ...

Я делаю некоторую встроенную сборку, и я хочу выполнить код несколько раз используя директиву .rept, которая указывает ассемблеру действовать так, как если бы строки, следующие за .rept, вплоть до той, что перед .endr, повторялись указанное количество раз.

Очевидная проблема, конечно, в том, что метка 18 уже указана. Я думаю есть ли способ создать динамическую метку для каждой итерации?

  __asm__ __volatile__ (".rept 10 \n\t");  
  __asm__ __volatile__(  "test eax, eax \n\t" );  
  __asm__ __volatile__(  "jne  18f\n\t" );  
  ...  
  __asm__ __volatile__(  "18: nop  18f\n\t" );   
  __asm__ __volatile__(  ".endr\n\t" );  

Ответы [ 2 ]

1 голос
/ 02 июня 2009

почему бы не пропустить .rept и .endr и просто зациклить вместо этого? установите ecx на 10 (или 0A, если вы хотите 10 циклов, а не 16), поместите метку (скажем, loopbegin :), где находится ваш оператор rept, и loop loopbegin), где находится оператор .endr. Таким образом, ваш 18 лейбл не будет двусмысленным.

1 голос
/ 27 мая 2009

Если вы не возражаете выполнять часть работы вручную, это должно быть выполнено с помощью встроенного символа . (точка), который оценивает текущий целевой адрес. См. документацию . Вы должны быть в состоянии сделать что-то вроде:

asm volatile("jne .+1");

Где 1 нужно изменить в зависимости от того, как далеко вы хотите прыгнуть, конечно. Это часть от руки, так как вам потребуется смещение в байтах. Я не проверял это, но я думаю, что это должно работать.

На этой странице в документации также показано, как использовать подстановку строк для создания меток, вы также можете использовать эту технику.

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