如何在ARM代码warriror项目中用c调用汇编代码?
我想在我的C代码中的某个地方重置PC指针,这可能需要一些汇编函数 因此,我遵循arm网站上的说明,然后: 在项目中的一个.s文件中,我添加了:如何在ARM代码warriror项目中用c调用汇编代码?,c,assembly,arm,C,Assembly,Arm,我想在我的C代码中的某个地方重置PC指针,这可能需要一些汇编函数 因此,我遵循arm网站上的说明,然后: 在项目中的一个.s文件中,我添加了: PRESERVE8 AREA SCopy, CODE EXPORT reset reset LDR PC, #0 END 然后在我的一个.c文件中,我做了: extern void reset()
PRESERVE8
AREA SCopy, CODE
EXPORT reset
reset
LDR PC, #0
END
然后在我的一个.c文件中,我做了:
extern void reset();
然后在某个地方调用reset()函数。但是,我总是被告知无法找到重置符号。我错过了什么吗?你可以用纯C:
typedef void(*func)();
func reset = NULL;
reset();
您使用的是什么汇编程序?您是否尝试过内联汇编指令?尝试在您的汇编代码中将名称更改为
\u reset
——GCC可能在LDR PC前加了下划线,0
是不合法的;我猜你的意思是LDR-PC,=#0
(这将是有效的,MOV-PC,#0
)@Doron我不确定。。。我正在使用Realview 3.0..真是一个惊人的巧合!请注意,这只适用于OP给出的示例-这不是从ARM上的C调用ASM函数的通用解决方案。@DrewMcGowen:我的问题(顺便说一句,我还在等你回答)的原因是我打算回答这个问题,我想先尝试一下,以确保它有效:)。。。现在,正如我们都知道的,它确实起作用了,当然(正如您所提到的),只是为了将PC设置为0(因此我的回答没有提到任何关于汇编的内容)。NULL
是main
的地址吗?这是怎么回事?安全吗?@FiddlingBits:No,NULL
只是指向内存地址0的指针,上面的代码完全按照OP的要求执行-将程序计数器设置为该内存地址。如果在该地址有一个有效的操作码(很可能是因为程序的代码部分是从该地址开始构建的),那么它是安全的。否则,程序很可能会崩溃。由于OP要求这样做,我认为程序的代码部分确实从该地址开始,因此该操作是安全的。顺便说一句,函数main
不一定是每个程序的入口点。@FiddlingBits:Me也是STM32的入口点。但这正是OP试图用LDR PC#0所做的,那么我该和谁争论呢?顺便说一句,即使在STM32上,我相信0x08000000
也可以通过链接器设置或链接器命令文件(项目中以.icf
结尾的文件)进行配置。