我尝试在ARM C代码中执行ASM指令DCD 0xf7f0a000。下面的方法我尝试和错误我得到:
DCD 0xf7f0a000
__asm("DCD 0xf7f0a000");
字符串错误:#3061:不可识别指令操作码
__asm { MOV r0,=0xf7f0a000 MOV r1,{r0} }
型错误:隐式物理寄存器R0应定义为变量。错误:隐式物理寄存器R1应定义为变量。
更新:
ARM编译器版本:ARM Compiler 5.06 update 6个PS:我试图通过未定义的操作生成异常。
ARM Compiler 5.06 update 6
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块(内联汇编)中使用,它只能在“真实的的”汇编语言代码中使用。
1条答案
按热度按时间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:
字符串
另一个编辑:最后回答标题中的实际问题:)我认为你不能。DCD不是一个操作码,它是一个汇编指令,它不能在__asm块(内联汇编)中使用,它只能在“真实的的”汇编语言代码中使用。