chap9 ARM程序设计.pptVIP

  • 3
  • 0
  • 约2.52万字
  • 约 76页
  • 2018-03-07 发布于湖北
  • 举报
chap9 ARM程序设计

* Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long ATPCS中的寄存器使用规则 寄存器 别名 用 法 R0~R3 A1~A4 入口参数 / 返回值 / 临时 (scratch)寄存器 R4~R11 V1~V8 子程序局部变量寄存器,其中: R7/V4也作为Thumb状态工作寄存器WR; R9/V6在支持可读写段位置无关的ATPCS中用作静态基址寄存器SB; R10/V7/在支持数据栈检查的ATPCS中为数据栈限制指针SL; R11/V8/在支持数据栈检查的ATPCS中为数据帧指针FP; R12 IP 临时(scratch)寄存器,用于过程链接胶合代码中(如连接器提供的veneers代码协助实现长跳转时会使用并修改其值) R13 SP 堆栈指针,不能用于其他用途 R14 LR 连接寄存器 R15 PC 程序计数器,不能用于其他用途 * 基本ATPCS (2):数据栈使用规则 ARM的数据栈可为FD(Full Descending),ED(Empty Descending),FA(Full Ascending)或EA(Empty Ascending) ,但ATPCS规定数据栈为FD类型,且8字节对齐的。 ? 数据栈指针(stack pointer)指向最后入栈的数据单元地址。 ? 数据栈基址(stack base)指向数据栈的最高地址。 ? 数据栈界限(stack limit)指向数据栈的最低地址。 ? 已占用的数据栈(used stack)指栈基址和SP之间的区域,其中包括栈指针对应的内存单元。 ? 数据栈中的数据帧(stack frame)指栈中为子程序分配的用来保存寄存器和局部变量的区域。 对于汇编代码来说,必须保证在进入该汇编代码后,直到调用外部代码之间,栈指针变化为偶数个字; 应使用PRESERVE8伪指令告诉连接器,本汇编代码是8字节对齐的; 应使用FRAME伪指令描述数据帧; * 基本ATPCS(3):参数传递规则 1、子程序入口参数传递规则 参数不超过4个时使用寄存器R0~R3,依次将各字数据传送到寄存器; 参数超过4个时将剩余的字数据传送到数据栈,入栈的顺序与参数顺序相反,即最后一个参数先入栈。 2、子程序结果返回规则 当结果为一个32位的整数时通过寄存器R0返回子程序结果; 当结果为一个64位的整数时通过R0和R1返回子程序结果,以此类推; 当对于位数更多的子程序结果,需要通过调用内存来传递。 * C程序调用汇编函数 汇编程序的设置要遵循ATPCS 规则,保证程序调用时参数、寄存器和堆栈的正确使用。 在汇编程序中使用EXPORT 伪指令声明本子程序,使其它程序可以调用此子程序。 在C 语言程序中使用extern关键字声明要调用的汇编子程序为外部函数。 汇编程序调用C函数 汇编程序的设置要遵循ATPCS 规则,保证程序调用时参数、寄存器和堆栈的正确使用。 在汇编程序中使用IMPORT 伪指令声明将要调用的C 程序函数。 在正确设置入口参数后使用BL 调用C程序函数。 * AREA SCopy, CODE, READONLY EXPORT strcopy ; 声明strcopy为导出符号 strcopy LDRB R2, [R1], #1 ; R1中的值为源数据块的首地址 STRB R2, [R0], #1 ; R0中的值为目标数据块的

文档评论(0)

1亿VIP精品文档

相关文档