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

jjhzyzn0  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(106)

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

rkttyhzu

rkttyhzu1#

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

相关问题