- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
项目9.C与汇编的互相调用
编制部门:计算机系 编制人:王晓春 编制日期:2011.1
项目编号
Item No. 项目名称
Item C与汇编的互相调用 训练对象
Class 计算机应用
技术专业大
二学生 学时
Time 2 课程名称
Course RISC微控制器嵌入式系统技术 教 材
Textbook
目的
Objective 熟悉ARM系统中C与汇编互相调用的规则
熟悉ADS1.2编译、下载、调试程序的基本方法
内容(方法、步骤、要求或考核标准及所需工具、材料、设备等)
一、实验内容
学习C与汇编互相调用的规则
实现二个内嵌汇编的实例
基于上述实例,修改程序实现指定的操作
二、准备知识
在汇编程序中访问C程序变量
在C程序中声明的全局变量,可以被汇编程序通过地址间接访问。具体方法如下:
使用IMPORT伪操作声明该全局变量
使用LDR指令读取该全局变量的内存地址,通常该全局变量内存地址值存放在程序的数据缓冲池中
根据该数据的类型,使用相应的LDR指令读取该全局变量的值,使用相应的STR指令修改该全局变量的值
各数据类型及其对应的LDR/STR指令为:
对于无符号的char类型的变量通过指令LDRB/STRB来读写
对于无符号的short类型的变量通过指令LDRH/STRH来读写
对于int类型的变量通过指令LDR/STR来读写
对于有符号的short类型的变量通过指令LDRSH来读取
对于有符号的short类型的变量通过指令STRH来写入
对于小于8个字的结构型变量,可以通过一条LDM/STM指令来读写整个变量
汇编程序与C程序的相互调用
在C程序中调用汇编程序
汇编程序的设计要遵守一定的规则,保证程序调用时参数的正确传递。在汇编程序中使用EXPORT伪操作声明本程序,使得本程序可以被别的程序调用,在C语言程序中使用extern关键词说明本程序声明该汇编程序。
在汇编程序中调用C程序
汇编程序的设计要遵守一定的规则,保证程序调用时参数的正确传递。在汇编程序中使用IMPORT伪操作声明要调用的C程序。
ATPCS规则(ARM/Thumb Procedure Call Standard specification)
ATPCS规则定义了子程序之间调用的一些规则:
寄存器的使用规则
子程序间通过寄存器R0-R3来传递参数,也可以记作A1-A4
在子程序中,使用寄存器R4-R11来保存局部变量,也可以记作V1-V8
R12用作子程序间内部调用,记作ip
R13用作数据堆栈指针,记作sp
R14用作连接寄存器,记作lr
参数传递的规则
当参数个数不超过4个时,可以使用寄存器R0-R3来传递参数,参数超过4个时,多余的参数传送到数据栈中,入栈的顺序与参数顺序相反,即最后一个参数先入栈。
对于结果返回的规则有:
结果为一个32位数,可以通过寄存器R0返回
结果为一个64位数,可以通过寄存器R0和R1来返回,依次类推。
多个结果时用堆栈返回其他结果
三、实训步骤、方法与要求
输入并调试以下程序:
程序strtest.c
#include stdio.h
extern void strcopy(char *s, char *d); extern起申明作用
int main()
{ char *srcstr = First string - source ;
char *dststr = Second string - destination ;
printf(Before copying:\n);
printf( %s\n %s\n,srcstr,dststr);
strcopy(srcstr,dststr);
printf(After copying:\n);
printf( %s\n %s\n,srcstr,dststr);
return (0);
}
程序scopy.s
AREA StrCopy, CODE, READONLY
EXPORT strcopy
strcopy
LDRB r2, [r0],#1
STRB r2, [r1],#1
CMP r2, #0
BNE strcopy
MOV pc,lr
END
主程序是汇编,程序是C语言的步骤:
主程序:
文档评论(0)