2013-08-29 2 views
1

Учитывая этот код: Tiny C Compiler: "ошибка: неизвестный код операции" СПМ"

int main(void) 
{ 
    __asm volatile ("jmp %eax"); 

    return 0; 
} 

32-битный TCC пожалуется с:

test.c:3: error: unknown opcode 'jmp'

но 64-битным версия будет компилироваться просто отлично.

Какая уловка?

Ну, я нашел решение при написании вопроса. Воодушевленный сообщением this на Meta SO, я спрошу его в любом случае и предоставил решение в ответ. Не стесняйтесь предлагать лучшую.

+1

Летучий код ??? –

+0

@ Мартин Джеймс: Из [здесь] (http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#ss5.4): «Если наша инструкция сборки должна выполняться там, где мы ее помещаем , (т. е. не следует выходить из цикла в качестве оптимизации), поместите ключевое слово 'volatile' после asm и перед(). – hauzer

ответ

0

Решение просто добавить звездочку (*) до регистра, например:

__asm volatile ("jmp *%eax"); 

Я не совсем уверен, что означает звезда. Согласно this SO сообщение:

The star is some syntactical sugar indicating that control is to be passed indirectly, by reference/pointer.

А почему он работает с 64-битным TCC, я полагаю, что это ошибка; 64-битный GCC жалуется на Error: operand type mismatch for 'jmp', как и следовало ожидать.

0

Прежде всего: я не знаю, что должен делать ваш код - это только для тестирования, работает ли ассемблер? Регистр EAX не имеет определенного содержимого в то время, когда вы выполняете «jmp% eax», чтобы вы никуда не прыгали.

В 64-разрядном режиме процессор позволяет использовать почти все регистры практически для всех целей. В 32-битном режиме существует множество ограничений. Вы не можете выполнить «jmp% eax» в 32-битном режиме, но только «jmp% ecx» (в сборщике GNU написано «jmp *% ecx»).

Edit:

Я удивлён, что «JMP% EAX» компилирует вообще, потому что даже в 64-битном режиме EAX не является допустимым операндом команды JMP.

+0

Слушай, у меня есть решение, но я не могу опубликовать его еще три часа из-за моей репутации. Я извлек жалобую строку кода из встроенной сборки C-программы. Ошибка - это ассемблер/компилятор, а не время выполнения. Я бы поднял ваш ответ на бит 'jmp% ecx', но у меня недостаточно репутации. – hauzer

+0

Я думал, что 'jmp% eax' разрешено, но только в защищенном режиме. – lurker

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