我正在尝试在ARM C代码中执行ASM指令DCD 0xf7f0a000
。
我尝试过的以下方法和出现的错误:
__asm("DCD 0xf7f0a000");
错误:#3061:无法识别的指令操作码
__asm
{
MOV r0,=0xf7f0a000
MOV r1,{r0}
}
错误:隐式物理寄存器R0应该定义为变量。
错误:隐式物理寄存器R1应该定义为变量。
更新:
ARM编译器版本:ARM Compiler 5.06 update 6
PS:我正在尝试通过执行未定义的操作来生成异常。
答案 0 :(得分:1)
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。
内联__asm使用起来非常麻烦,除非您完全了解自己在做什么。通常,将汇编代码放在单独的文件中要容易得多。 (以前带有.asm扩展名,现在不确定)。
PS:我正在尝试通过执行未定义的操作来生成异常。
据我所知,您正在尝试写入无效的地址,这与“未定义的操作”不同,您可以使用无效的指针从C中执行此操作,完全不需要asm:>
int *a;
a = 0xf7f0a000;
*a = 2019;
另一个编辑:最后回答标题中的实际问题:)我认为您不能。 DCD不是操作码,它是汇编程序指令,不能在__asm块(内联汇编)中使用,只能在“实际”汇编语言代码中使用。