以下是scratch控制库中的命令,那个命令可以实现程序的无条件循环执行?

寄存器中——这常用于 从中断处理函数中返回

 将本文件中的某个程序标号定义为全局的

为了使C语言程序和汇编程序之间能够互相调用,必须为子程序间的调用制定规则,在ARM处理器中,这个规则被称为  ATPCS  :ARM程序和THUMB程序中子程序调用的规则。基本的ATPCS规则包括 寄存器使用规则 数据栈使用规则 参数传递规则

 。如果在子程序中使用了它们的某些寄存器,子程序进入时要保存这些寄存器的值,在返回前恢复它们;对于子程序中没有使用到的寄存器,则不必进行这些操作。在THUMB程序中,通常只能使用寄存器  r4 ~ r7  来保存局部变量。
 不能用作其他用途。它的值在进入、退出子程序时必须相等。
寄存器  r14  称为连接寄存器,别名为  lr  。它用于保存子程序的返回地址。如果在子程序中保存了返回地址(比如将 

子 程序内部调用的scratch寄存器

ARM状态局部变量寄存器8

ARM状态局部变量寄存器7、在支持数据栈检查的ATPCS中为数据栈限制指针

ARM状态局部变量寄存器6、在支持RWPIATPCS中为静态基址寄存器

ARM状态局部变量寄存器5

ARM状态局部变量寄存器4THUMB状态工作寄存器

ARM状态局部变量寄存器3

ARM状态局部变量寄存器2

ARM状态局部变量寄存器1

参数/结果/scratch寄存器4

参数/结果/scratch寄存器3

参数/结果/scratch寄存器2

参数/结果/scratch寄存器1


数据栈有两个增长方向:向内存地址减小的方向增长时,称为  DESCENDING栈  ;向内存地址增加的方向增长时,称为  ASCENDING栈 所谓数据栈的增长就是移动栈指针。当栈指针指向栈顶元素(最后一个入栈的数据)时,称为  FULL栈  ;当栈指针指向栈顶元素(最后一个入栈的数据)相邻的一个空的数据单元时,称为   空递增
ATPCS规定数据栈为FD类型,并且对数据栈的操作是8字节对齐的 。使用  stmdb / ldmia  批量内存访问指令来操作FD数据栈。
使用stmdb命令往数据栈中保存内容时,先递减sp指针,再保存数据,使用ldmia命令从数据栈中恢复数据时,先获得数据,再递增sp指针,sp指针总是指向栈顶元素,这刚好是FD栈的定义。

  为了使单独编译的C语言程序和汇编程序之间能够相互调用,必须为子程序之间

的调用规定一定的规则.ATPCS就是ARM程序和THUMB程序中子程序调用的基本规

ATPCS规定了一些子程序之间调用的基本规则.这些基本规则包括子程序调用过

程中寄存器的使用规则,数据栈的使用规则,参数的传递规则.为适应一些特定的需要,

对这些基本的调用规则进行一些修改得到几种不同的子程序调用规则,这些特定的调

用规则包括:支持数据栈限制检查的ATPCS. 支持只读段位置无关的ATPCS. 支持可

读写段位置无关的ATPCS. 支持ARM程序和THUMB程序混合使用的ATPCS. 处理浮

有调用关系的所有子程序必须遵守同一种ATPCS. 编译器或者汇编器在ELF格

式的目标文件中设置相应的属性,标识用户选定的ATPCS类型.对应不同类型的

ATPCS规则,有相应的C语言库,连接器根据用户指定的ATPCS类型连接相应的C语

使用ADS的C语言编译器编译的C语言子程序满足用户指定的ATPCS类型. 而对

于汇编语言程序来说,完全要依赖用户来保证各子程序满足选定的ATPCS类型. 具

体来说,汇编语言子程序必须满足下面三个条件: 在子程序编写时必须遵守相应的

ATPCS规则; 数据栈的使用要遵守ATPCS规则; 在汇编编译器中使用-apcs选项...

子程序在返回前无需恢复寄存器R0~R3的内容.

V1~V8 .如果 在子程序中 使用到V1~V8的某些寄存器, 在进入子程序时 必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值,对于子程序中没有用到的寄存器则不必

执行这些操作.在THUMB程序中,通常只能使用寄存器R4~R7来保存局部变量.

4. 寄存器R13用作数据栈指针,记做SP, 在子程序中 寄存器R13不能用做其他用途.

寄存器SP在进入子程序时的值和退出子程序时的值必须相等.

5. 寄存器R14用作连接寄存器,记作lr ; 它用于保存子程序的返回地址,如果在子程

序中保存了返回地址,则R14可用作其它的用途.

6. 寄存器R15是程序计数器,记作PC ; 它不能用作其他用途.

7. ATPCS中的各寄存器在ARM编译器和汇编器中都是预定义的.(这句话很关键)

   栈指针通常可以指向不同的位置.当栈指针指向栈顶元素(即最后一个入栈的数

据元素)时,称为FULL栈.当栈指针指向与栈顶元素相邻的一个元素时,称为Empty栈.

数据栈的增长方向也可以不同. 当数据栈向内存减小地址方向增长时,称为

  综合这两种特点可以由以下4种数据栈: FD ED FA EA . ATPCS规定数据栈为FD类型,并对数据栈的操作是8字节对齐的,下面是一个数据栈的示例及相关的名词.

1.数据栈栈指针.stack pointer 指向最后一个写入栈的数据的内存地址.

2.数据栈的基地址.stack base 是指数据栈的最高地址.由于ATPCS中的数据栈是

FD类型的,实际上数据栈中最早入栈数据占据的内存单元基地址的下一个内存单

3.数据栈界限.stack limit 是指数据栈中可以使用的最低的内存单元地址.

4.已占用的数据栈.used stack 是指数据栈的基地址数据栈栈指针之间的区域.

其中包括数据栈栈指针对应的内存单元.

是指在数据栈中,为子程序分配的用来保存存器局部变量的区域.

  异常中断的处理程序可以使用 被中断程序的数据栈,这时用户要保证中断的程序

数据栈足够大. 使用ADS编译器产生的目标代码中包含了DRFAT2格式的数据帧.在

调试过程中,调试器可以使用这些数据帧来查看数据栈中的相关信息.而对于汇编语

言来说,用户必须使用FRAME伪操作来描述数据栈中的数据帧.ARM汇编器根据这

些伪操作在目标文件中产生相应的DRFAT2格式的数据帧.

在ARMv5TE中,批量传送指令LDRD/STRD要求数据栈是8字节对齐,以提高数

据的传送速度.用ADS编译器产生的目标文件中,外部接口的数据栈都是8字节对齐的,

并且编译器将告诉连接器: 本目标文件中的数据栈是8字节对齐的. 而对于汇编程序

来说,如果目标文件中包含了外部调用,则必须满足以下条件: 

      外部接口的数据栈一定是8位对齐的,也就是要保证在进入该汇编代码后,直到该汇编程序调用外部代码之间,数据栈的栈指针变化为偶数个字; 

根据参数个数是否固定,可以将子程序分为参数个数固定子程序参数个数可

子程序.这两种子程序的参数传递规则是不同的.

1.参数个数可变的子程序参数传递规则

   对于参数个数可变的子程序,当参数不超过4个时,可以使用寄存器R0~R3来进行

参数传递,当参数超过4个时,还可以使用数据栈来传递参数. 

   在参数传递时,将所有参看做是存放在连续的内存单元中的字数据。然后,依次将各名字数据传送到寄存器R0,R1,R2,R3; 

   如果参数多于4个,将剩余的字数据传送到数据栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈. 按照上面的规则,一个浮点数参数可以通过寄存器传递,也可以通过数据栈传递,也可能一半通过寄存器传递,另一半通过数据栈传递.

2.参数个数固定的子程序参数传递规则

对于参数个数固定的子程序,参数传递与参数个数可变的子程序参数传递规则不

同,如果系统包含浮点运算的硬件部件,浮点参数将按照下面的规则传递: 各个浮点参

数按顺序处理;为每个浮点参数分配FP寄存器;分配的方法是,满足该浮点参数需要的

且编号最小的一组连续的FP寄存器.第一个整数参数通过寄存器R0~R3来传递,其他

1.结果为一个32位的整数时,可以通过寄存器R0返回.

2.结果为一个64位整数时,可以通过R0和R1返回,依此类推.

3.结果为一个浮点数时,可以通过浮点运算部件的寄存器f0,d0或者s0来返回.

4.结果为一个复合的浮点数时,可以通过寄存器f0-fN或者d0~dN来返回.

5.对于位数更多的结果,需要通过调用内存来传递.

A.支持数据栈限制检查的ATPCS.

如果在程序设计期间能够准确地计算出程序所需的内存总量,就不需要进行数据

栈的检查,但是在通常情况下这是很难做到的,这时需要进行数据栈的检查. 在进行数

据栈的检查时,使用寄存器R10作为数据栈限制指针,这时寄存器R10又记作sl.用户在

程序中不能控制该寄存器.具体来说,支持数据栈限制的ATPCS要满足下面的规则: 在

已经占有的栈的最低地址和sl之间必须有256字节的空间,也就是说,sl所指的内存地

址必须比已经占用的栈的最低地址低256个字节.当中断处理程序可以使用用户的数

据栈时,在已经占用的栈的最低地址和sl之间除了必须保留的256个字节的内存单元

外,还必须为中断处理预留足够的内存空间; 用户在程序中不能修改sl的值;数据栈栈

指针sp的值必须不小于sl的值.

与支持数据栈限制检查的ATPCS相关的编译/汇编选项有下面几种: 选项/SWST

指示编译器生成的代码遵守支持数据栈限制检查的ATPCS,用户在程序设计期间不

能够准确计算程序所需的数据栈大小时,需要指定该选项;选项/noswst指示编译器生

成的代码不支持数据栈限制检查的功能,用户在程序设计期间能够准确计算出程序所

需的数据栈大小,可以指定该选项,这个选项是默认的;选项/SWSTNA 如果汇编程序

对于是否进行数据栈检查无所谓,而与该汇编程序连接的其他程序指定了选项

B.编写遵守支持数据栈限制检查的ATPCS的汇编语言程序.

对于C程序和C++程序来说,如果在编译时指定了选项SWST,生成的目标代码将

遵守支持数据栈限制检查的ATPCS. 对于汇编语言程序来说,如果要遵守支持数据

栈限制检查的ATPCS,用户在编写程序时必须满足支持数据栈限制检查的ATPCS所

要求的规则,然后指定选项SWST,下面介绍用户编写汇编语言程序时的一些要求.

叶子子程序是指不调用别的程序的子程序.

数据栈小于256字节的叶子子程序不许要进行数据栈检查,如果几个子程序组合起

来构成的叶子子程序数据栈也小于256字节,这个规则同样适用; 数据栈小于256字节

的非叶子子程序可以使用下面的代码段来进行数据栈检查.

数据栈大于256字节的子程序,为了保证sp的值不小于数据栈可用的内存单元最小

的地址值,需要引入相应的寄存器.

支持只读段位置无关的ATPCS...

支持可读写段位置无关的ATPCS...

在编译或汇编时,使用/intework告诉编译器或汇编器生成的目标代码遵守支持

ARM程序和THUMB程序混合使用的ATPCS,它用在以下场合: 程序中存在ARM程序

调用THUMB程序的情况;程序中存在THUMB程序调用ARM程序的情况;需要连接器

来进行ARM状态和THUMB状态切换的情况;.在下述情况下使用选项nointerwork:程

序中不包含THUMB程序;用户自己进行ARM程序和THUMB程序切换.需要注意的是:

在同一个C/C++程序中不能同时有ARM指令和THUMB指令.


我要回帖

更多关于 scratch转换成可执行程序 的文章