2013-09-25 3 views
3

У меня есть небольшой вопрос об использовании ASM в c. Я хочу выполнить инструкцию:Использование команды ASM в C

LDR PC,=0x123456 

Это дает мне ошибку «неожиданный токен в операнде».

asm("LDR PC,=0x123456"); 

Это дает «недопустимое ограничение».

asm("LDR PC," : "m" (0x123456)); 

Каков правильный способ сделать это?

+9

Какой компилятор C мы говорим здесь? –

+0

встроенная сборка не поддерживается для всех компиляторов - например, sun sparc - и, если это так, является компилятором – Bathsheba

+0

Недействительным 'constrant' вы имеете в виду' ограничение? – Shahbaz

ответ

2

Вы используете это:

asm("LDR PC,=0x123456"); 

Это не является стандартной инструкции ARM сборки, а псевдо-инструкций при условии, как расширение компилятора. Эта псевдо-инструкция преобразуется в другие инструкции по сборке при ее компиляции. Кажется, clang не поддерживает это расширение компилятора (см. Это thread). Вы должны сами выполнить преобразование в инструкцию по сборке, см. Документацию по ARM для преобразования LDR pseudo-instruction.

0

Вы, вероятно, может достичь желаемого эффекта в виде простого C:

((void (*)(void))0x123456)(); 

или, если вы предпочитаете более многословен:

typedef void FN(void); 
((FN*)0x123456)(); 
0

Я согласен с @ Этьена. Я попробовал код с помощью mi toolkey. Он работает нормально.

Я думаю, вы должны прочитать руководство о том, как компилятор изменяет директиву на инструкции (обычно два инструкции mov).

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