在C 语言程序和ARM 汇编程序之间相互调用必须遵守ATPCS(ARM-Thumb Procedure Call Standard)规则。 C 语言程序和汇编语言程序之间的相互调用,可以从汇编程序对C 语言程序全局变量的访问、在C 语言程序中调用汇编程序以及在汇编程序中调用C 语言程序这三方面来介绍,下面分别给出了具体实例。
(1)汇编程序访问C 语言全局变量
汇编程序可以通过地址间接访问在C 语言程序中声明的全局变量。 通过使用IMPORT关键词引入全局变量,并利用LDR 和STR 指令根据全局变量的地址可以访问它们。 对于不同类型的变量,需要采用不同选项的LDR 和STR 指令,如下所示:
对于结构,如果知道各个成员的偏移量,则可以通过加载和存储指令进行访问。 如果结构所占空间小于8 个字,可以用LDM 和STM 一次性读写。
下面是一个在汇编程序中访问C 语言程序全局变量的例子,它读取全局变量globvar,并将其加“2”后写回。 程序中变量globvar 是在C 语言程序中声明的全局变量。
示例:C 语言程序全局变量在汇编程序中的访问。
(2)C 语言程序调用汇编程序
为了保证程序调用时参数的正确传递,汇编程序的设计要遵守ATPCS。 在汇编程序中需要使用EXPORT 伪操作来声明,使得本程序可以被其他程序调用。 同时,在C 语言程序调用该汇编程序之前,需要在C 语言程序中使用extern 关键词来声明该汇编程序。 下面例子中,汇编程序strcopy 完成字符串复制功能,C 语言程序调用strcopy 完成字符串的复制工作。
示例:C 语言程序调用汇编程序完成字符串拷贝。
C 源程序:(www.xing528.com)
汇编源程序:
根据ATPCS,函数的前四个参数在R0 ~R3 中。 C 代码源程序可以保存为strtest. c,汇编程序是scopy. s。
(3)汇编程序调用C 程序
为了保证程序调用时参数的正确传递,汇编程序的设计要遵守ATPCS。 在C 语言程序中不需要使用任何关键字来声明被汇编语言调用的C 语言程序,但是,在汇编程序调用该C 语言程序之前,需要在汇编语言程序中使用IMPORT 伪操作来声明该C 语言程序。 在汇编程序中通过BL 指令来调用子程序。 下面例子中,汇编程序strcopy 完成字符串复制功能,C 语言程序调用strcopy 完成字符串的复制工作。
示例:汇编程序调用C 语言程序。
C 函数原型:
汇编程序调用C 程序g()计算5 个整数i,2*i,3*i,4*i,5*i 的和。
汇编源程序:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。