- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ARM开发工具编译环境下实例 2.内嵌汇编的局限性 ARM开发工具编译环境下内嵌汇编语言,指令操作数可以是寄存器、常量或C语言表达式。可以是char、short或int类型,而且是作为无符号数进行操作。 当表达式过于复杂时需要使用较多的物理寄存器,有可能产生冲突。 ARM开发工具下内嵌汇编语言,可直接引用C语言中的变量。 (2)物理寄存器 不要直接向程序计数器PC赋值,程序的跳转只能通过B或BL指令实现。 一般将寄存器R0~R3、R12及R14用于子程序调用存放中间结果,因此在内嵌汇编指令中,一般不要将这些寄存器同时指定为指令中的物理寄存器。 在内嵌的汇编指令中使用物理寄存器时,如果有C语言变量使用了该物理寄存器,则编译器将在合适的时候保存并恢复该变量的值。需要注意的是,当寄存器SP、SL、FP以及SB用作特定的用途时,编译器不能恢复这些寄存器的值。 通常在内嵌汇编指令中不要指定物理寄存器,因为有可能会影响编译器分配寄存器,进而可能影响代码的效率。 (3)标号、常量及指令展开 C语言程序中的标号可以被内嵌的汇编指令所使用。但是只有B指令可以使用C语言程序中的标号,BL指令不能使用C语言程序中的标号。 (4)内存单元的分配 内嵌汇编器不支持汇编语言中用于内存分配的伪操作。所用的内存单元的分配都是通过C语言程序完成的,分配的内存单元通过变量以供内嵌的汇编器使用。 (5)SWI和BL指令 SWI和BL指令用于内嵌汇编时,除了正常的操作数域外,还必须增加如下3个可选的寄存器列表: 用于存放输入的参数的寄存器列表。 用于存放返回结果的寄存器列表。 用于保存被调用的子程序工作寄存器的寄存器列表。 8.6.2 ARM汇编语言与嵌入式C程序相互调用 1.汇编程序调用C程序 2. C程序调用汇编程序 1.汇编程序调用C程序 在ARM开发工具编译环境下,汇编程序中要使用IMPORT伪操作声明将要调用的C程序。 示例解析 在ARM开发工具编译环境下设计程序,用ARM汇编语言调用C语言实现20!的阶乘操作,并将64位结果保存到寄存器R0、R1中,其中R1中存放高32位结果。 首先建立汇编源文件start.s 然后建立C语言源文件factorial.c 程序运行结果如下: R0 = 0x82B40000 R1 = 0x21C3677C 2. C程序调用汇编程序 在ARM开发工具编译环境下,汇编程序中要使用EXPORT伪操作声明本程序可以被其他程序调用。同时也要在C程序中要用关键字extern声明要调用的汇编语言程序。 示例解析 在ARM开发工具编译环境下设计程序,用C语言调用ARM汇编语言实现20的阶乘(20!)操作,并将64位结果保存到0xFFFFFFF0开始的内存地址单元,按照小端格式低位数据存放在低地址单元。 第一步:建立启动C程序的代码,请读者参阅前面的章节自行建立。 第二步:建立C语言源文件main.c,与GNU ARM编译环境下相同。 每三步:建立汇编源文件Factorial.s 程序运行结果如下: 思考与练习题 volatile限制符在程序中起到什么作用,请举例说明。 何为可重入函数?如果使程序具有可重入性,在程序设计中应注意哪些问题? 内嵌式汇编有哪些局限性?编写一段代码采用C语言嵌入汇编程序,在汇编程序中实现字符串的拷贝操作。 (3). 宏定义与函数 带参宏与函数的区别 带参宏 函数 处理时间 编译时被展开 程序运行时被处理 参数类型 无需定义参数类型 要定义实参,形参数据类型 处理过程 不分配内存 只是进行简单的字符替换 分配内存单元 先求出实参值,再传入形参 运行速度 不占运行时间 调用和返回占时间 代码长度 没展开一次都使代码长度增长,使用宏次数越多时,宏展开后源程序变长 函数调用不使代码变长 返回值 没有返回值 可以得到返回值 文件包含(#include) 文件包含的功能是使得一个源文件可以将另一个源文件的内容全部包含进来,它的一般形式为: #include “文件名” //先搜索当前目录,再搜索标准目录,可以指定目录#include文件名 //直接按标准目录搜索 /*头文件test.h */ #define SQR(x) ((x)*(x)) #define CUBE(x) ((x)*(x)*(x)) #define QUAD(x) ((x)*(x)*(x)*(x)) /*源文件 test.c*/ #include stdio.h #include e:\qiutie\test.h //指定目录,包含头文件 #define MAX_POWER 10 void main() { int n; printf(number\t exp2\t exp3\t exp4\n); p
文档评论(0)