Как выполнить DCD в C, используя __asm? - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь выполнить инструкцию ASM DCD 0xf7f0a000 в коде ARM C.

Приведенные ниже методы и ошибки, которые я получил:

__asm("DCD 0xf7f0a000");

Ошибка: #3061: код операции нераспознанной инструкции

__asm
{
MOV r0,=0xf7f0a000
MOV r1,{r0}
}

Ошибка: неявный физический регистр R0 должен быть определен как переменная.

Ошибка: неявный физический регистр R1 должен быть определен какпеременная.

Обновление:

Версия компилятора ARM: ARM Compiler 5.06 update 6

PS: я пытаюсь создать исключение, выполнив неопределенноеработа.

1 Ответ

1 голос
/ 05 апреля 2019

ARMCC имеет документацию очень хорошего качества, доступную у поставщика.

Вы не указали версию своего ARMCC, очевидно, с тех пор, как я ее использовал (~ 15 лет назад), все изменилось.

Вам необходимо изучить это, если вы хотите использовать встроенную сборку (опять же, если это соответствует вашей версии компилятора): https://developer.arm.com/tools-and-software/software-development-tools/legacy-tools/ds-5-development-studio/resources/tutorials/using-inline-assembly-to-improve-code-efficiency

Примечание: имена регистров во встроенном коде сборки обрабатываются как C или C ++переменные.Они не обязательно относятся к физическому регистру с тем же именем.В нашем C-коде мы используем имена переменных r5 и r6 для наших операндов, но фактические используемые регистры - это r1 и r2.

Inline __asm ​​может быть очень громоздким, если вы не понимаете, что именно выделаешь.Как правило, гораздо проще поместить ваш ассемблерный код в отдельный файл.(Раньше было расширение .asm, тогда я не был уверен в этом).

PS: я пытаюсь создать исключение, выполнив неопределенную операцию.

Покакак я вижу, вы пытаетесь записать в неверный адрес, это не то же самое, что «неопределенная операция», и вы можете сделать это из C, используя недопустимый указатель, вообще не нужно asm:

int *a;
a = 0xf7f0a000;
*a = 2019;

Другое редактирование: И, наконец, отвечая на фактический вопрос в заголовке :) Я не думаю, что вы можете.DCD - это не код операции, это директива на ассемблере, его нельзя использовать в блоке __asm ​​(встроенная сборка), его можно использовать только в «реальном» коде языка ассемблера.

...