0

我正在尝试DCD 0xf7f0a000在 ARM C 代码中执行 ASM 指令。

我尝试的以下方法和我得到的错误:

__asm("DCD 0xf7f0a000");

错误:#3061:无法识别的指令操作码

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

错误:隐式物理寄存器 R0 应定义为变量。

错误:隐式物理寄存器 R1 应定义为变量。

更新:

ARM 编译器版本:ARM Compiler 5.06 update 6

PS:我正在尝试通过执行未定义的操作来生成异常。

4

1 回答 1

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 块(内联汇编)中使用,它只能在“真正的”汇编语言代码中使用。

于 2019-04-05T10:58:49.447 回答