如何使用__asm在C中执行DCD?

时间:2019-04-05 06:53:27

标签: assembly arm cortex-m3 armcc

我正在尝试在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:我正在尝试通过执行未定义的操作来生成异常。

1 个答案:

答案 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块(内联汇编)中使用,只能在“实际”汇编语言代码中使用。