- 1、本文档共44页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]第九章 ARM程序设计
9.1 ARM汇编器伪指令 符号定义伪指令 汇编控制伪指令 9.2 汇编语言语句格式 程序中的常量、变量 程序中常用符号代表地址、常量和变量 表达式与运算符 9.3 ARM汇编语言程序结构 子程序及其调用 9.4 ARM汇编语言与C/C++混合编程 ARM工程 完成应用所需的所有文件集合: 汇编源程序(.s),C语言源程序(.c),C++源文件(.cpp)以及头文件(.h) ARM程序框架 ATPCS概述 C和汇编语言的混合编程 寄存器的使用规则: 1. 子程序通过寄存器R0~R3来传递参数。这时寄存器可以记作:A0~A3 , 被调用的子程序在返回前无需恢复寄存器R0~R3的内容。 2. 在子程序中,使用R4~R11来保存局部变量,这时寄存器R4~R11可以记作: V1~V8 .如果在子程序中使用到V1~V8的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值,对于子程序中没有用到的寄存器则不必执行这些操作.在THUMB程序中,通常只能使用寄存器R4~R7来保存局部变量. 3.寄存器R12用作子程序间scratch寄存器,记作ip; 在子程序的连接代码段中经常会有这种使用规则. 4. 寄存器R13用作数据栈指针(SP),在子程序中寄存器R13不能用做其他用途. SP在进入子程序时的值和退出子程序时的值必须相等. 5. 寄存器R14用作连接寄存器(LR); 它用于保存子程序的返回地址,如果在子程序中保存了返回地址,则R14可用作其它的用途. 6. 寄存器R15是程序计数器(PC); 它不能用作其他用途. 7. ATPCS中的各寄存器在ARM编译器和汇编器中都是预定义的. ATPCS概述 数据栈的使用规则 ARM有以下4种数据栈指针:FD(Full Descending),ED(Empty Descending),FA(Full Ascending),EA(Empty Ascending) 。ATPCS规定数据栈为FD类型,并对数据栈的操作是8字节对齐的。 1.数据栈栈指针 stack pointer 指向最后一个写入栈的数据的内存地址。 2.数据栈的基地址 stack base 是指数据栈的最高地址。由于ATPCS中的数据栈是FD类型的,实际上数据栈中最早入栈数据占据的内存单元是基地址的下一个内存单元。 3.数据栈界限 stack limit 是指数据栈中可以使用的最低的内存单元地址。 4.已占用的数据栈 used stack 是指数据栈的基地址和数据栈栈指针之间的区域。其中包括数据栈栈指针对应的内存单元。 5.数据栈中的数据帧(stack frames) 是指在数据栈中,为子程序分配的用来保存寄存器和局部变量的区域。 ATPCS概述 参数的传递规则 1.参数个数可变的子程序参数传递规则 对于参数个数可变的子程序,当参数不超过4个时,可以使用寄存器R0~R3来进行参数传递。 如果参数多于4个,将剩余的字数据传送到数据栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈。 2.参数个数固定的子程序参数传递规则 第一个整数参数通过寄存器R0~R3来传递,其他参数通过数据栈传递。 如果系统包含浮点运算的硬件部件,浮点参数将按照下面的规则传递:各个浮点参数按顺序处理;为每个浮点参数分配FP寄存器;分配的方法是,满足该浮点参数需要的且编号最小的一组连续的FP寄存器。 ATPCS概述 子程序结果返回规则 1.结果为一个32位的整数时,可以通过寄存器R0返回。 2.结果为一个64位整数时,可以通过R0和R1返回,依此类推。 3.结果为一个浮点数时,可以通过浮点运算部件的寄存器f0,d0或者s0来返回。 4.结果为一个复合的浮点数时,可以通过寄存器f0-fN或者d0~dN来返回。 5.对于位数更多的结果,需要通过调用内存来传递。 ATPCS概述 C程序调用汇编函数 函数名是跳转目标地址(汇编语言程序标号) 函数调用涉及的参数、结果值和函数中定义的变量是局部变量,形参和返回值都应该定义在具有暂存性质的寄存器及堆栈中。 调用满足ATPCS规定 例如 调用有2个参数的函数Addint(int x, int y),为其分配寄存器R0,R1(其中R0还用于存放返回结果) 参数0 参数1 参数2 参数3 R3 R2 R1 R0 Addint(int x, int y) : : 参数5参数4 参数多余4个存放堆栈中,注意存放顺序 0x000200100x0002000C0x000200080栈增长方向 汇编语言源程序(指令、伪指令、宏) 汇编 目标程序 (机器码)
文档评论(0)