Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在ARM代码warriror项目中用c调用汇编代码?_C_Assembly_Arm - Fatal编程技术网

如何在ARM代码warriror项目中用c调用汇编代码?

如何在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()

我想在我的C代码中的某个地方重置PC指针,这可能需要一些汇编函数

因此,我遵循arm网站上的说明,然后:

在项目中的一个.s文件中,我添加了:

     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
结尾的文件)进行配置。