首页 百科知识 在汇编中调用的函数

在汇编中调用的函数

时间:2022-10-16 百科知识 版权反馈
【摘要】:在汇编中调用C的函数,需要在汇编中IMPORT 对应的C函数名,然后将C的代码放在一个独立的C文件中进行编译,剩下的工作由连接器来处理。在汇编中调用C的函数,参数的传递也是通过ATPCS来实现的。需要指出的是当函数的参数个数大于4时,要借助stack,具体见ATPCS规范。在“子程序中”,使用寄存器R4~R11来保存局部变量。寄存器R12用于子程序间scratch寄存器,记作IP。

5.2 在汇编中调用C的函数

在汇编中调用C的函数,需要在汇编中IMPORT 对应的C函数名,然后将C的代码放在一个独立的C文件中进行编译,剩下的工作由连接器来处理。

img69

在汇编中调用C的函数,参数的传递也是通过ATPCS来实现的。需要指出的是当函数的参数个数大于4时,要借助stack,具体见ATPCS规范。

1.在C\C++程序中使用内嵌的汇编指令的语法格式

在ARM C语言程序中,使用关键字__asm来标识一段汇编指令程序。

img70

其中,如果一行中有多个汇编指令,指令之间使用分号(;)分开。在一条指令占多行,要使用续行符号(\)。

2.在C/C++程序中内嵌汇编指令注意事项

● 必须小心使用物理寄存器,如R0~R3、SP、LR 和CPSR 中的N,Z,C,V 标志位。因为“计算汇编代码中的C 表达式时”,可能会使用这些物理寄存器,并会修改N,Z,C,V标志位。

img71

在计算x/y 时R0 会被修改,从而影响R0+x/y 的结果。用一个C 程序的变量代替R0就可以解决这个问题:

img72

内嵌汇编器探测到隐含的寄存器冲突就会报错。

● 不要使用寄存器代替变量。尽管有时寄存器明显对应某个变量,但也不能直接使用寄存器代替变量。

img73

尽管根据编译器的编译规则似乎可以确定R0 对应x,但这样的代码会使内嵌汇编器认为发生了寄存器冲突。用其他寄存器代替R0 存放参数x,使得该函数将x 原封不动地返回。

这段代码的正确写法如下:

img74

3.从汇编程序中访问C程序变量

在C程序中声明的全局变量可以被汇编程序“通过地址间接访问”。具体访问方法如下:

①使用IMPORT伪指令声明这个全局变量。

②使用LDR指令读取该全局变量的内存地址,通常该全局变量的内存地址存放在程序的数据缓冲池中。

③根据该数据类型,使用相应的LDR指令读取该全局变量的值,使用相应的STR指令修改该全局变量的值。

img75

4.C程序与汇编程序互相调用规则

寄存器的使用规则:“子程序间”通过寄存器R0~R3来传递参数。在“子程序中”,使用寄存器R4~R11来保存局部变量。

寄存器R12用于子程序间scratch寄存器(用于保存SP,在函数返回时使用该寄存器出桟),记作IP。

寄存器R13用于数据栈指针,记作SP。寄存器SP在进入子程序时的值和退出子程序时的值必须相等。

寄存器R14称为链接寄存器,记作LR。它用于保存子程序的返回地址。

寄存器R15是程序计数器,记作PC。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈