ARM汇编

来源:互联网 发布:spss如何预测未来数据 编辑:程序博客网 时间:2024/06/10 09:47

一、ARM寄存器

R15:别名PC,中文译为程序计数器;它的值是当前正在执行的指令在内存中的位置。

R14:别名LR,中文译为链接寄存器;它与子程序的调用密切相关,用于存放子程序的返回地址,是ARM程序实现子程序调用的关键。

R13:别名SP,中文译为栈指针寄存器;它是用于存放堆栈的栈顶地址的(内存位置)。

寄存器R0~R12是普通的数据寄存器,可用于任何地方。

CPSR:中文译为当前程序状态寄存器;它是用于保存程序的当前状态的。包括:条件代码标志位(ARM指令条件执行的依据,记录运算结果),控制位(控制CPU是否响应中断),模式位(决定ARM的其中工作模式)。

SPSR:中文译为程序状态寄存器;在异常发生时,由硬件自动将异常发生前的CPSR值放到SPSR中,以便将来在异常处理结束后、程序能回复原来CPSR的值。

二、ARM寻址方式

1.寄存器寻址

操作数来源于寄存器。eg:MOV pc, lr

2.立即数寻址

操作数来源于一个立即数。eg:MOV pc, #64

3.寄存器间接寻址

操作数来源于寄存器指定地址的存储单元中。eg:LDR R0, [R2]

三、ARM指令

1.单寄存器加载指令

LDR r0, [r1]:将[r1]所指内存中的一个字(4字节, 32位)加载到寄存器r0中。

LDRB r0, [r1]:将[r1]所指内存中的一个字节(8位)加载到寄存器r0中;其余高24位补0。

2.单寄存器存储指令

STR r0, [r1]:将r0中的值存储到内存的4字节中。

STRB r0, [r1]:将r0中的低8bit存储到内存的1字节中。

3.分支指令

B Label:跳转到标号Label处。

BL Label:跳转到标号Label处,并将返回地址PC保存到LR中。

BX r0:将r0的值作为地址,跳转到该地址处。

4.数据处理指令

MOV r0, r1:将r1的值赋给r0。

ADD(SUB) r0, r1, r2:将r1的值加上(减去)r2的值,结果保存到r0中。

AND(ORR,EOR) r0, r1, r2:将r1的值与(或、异或)r2的值,结果保存到r0中。

CMP r1, r2:比较r1和r2值的大小。说明:该指令会影响CPSR寄存器中的条件代码标志位。

四、ARM伪指令

  ARM伪指令指,该指令并不会被翻译成ARM对应的二进制指令;它只是在编译阶段起作用的,相当于C中的条件编译关键字。

AREA:定义一个段。

CODE:声明是代码段。

READONLY:只读。

ENTRY:声明整个程序的入口点。

CODE32:表示ARM指令,而非thumb指令。

END:源代码文件结束。

GBLA:定义全局算数变量。

SETA:对全局算数变量赋值。

DCD:为立即数分配字存储空间。

DCB:为立即数分分配字节存储空间。

IF,ELSE,ENDIF:相当与C中的条件编译。

WHILE,WEND:同上。

MACRO、MEND、MEXIT:相当于C中宏替换;即用宏定义一个类似函数的功能。

EQU:相当于C中的宏定义。

EXPORT:与C混合编程时导出。

IMPORT:与C混合编程中导入。

说明:ARM指令与ARM伪指令的区别很明显——后者只是给编译器提供某些信息,以帮助编译器正确完成程序的编译;当编译完成后,汇编伪操作就完成了它的使命,它不可能在最终的二进制代码中留下任何痕迹。即:ARM伪指令是给编译器看的,而不是CPU。

五、ARM汇编与C混合编程

1.C中调用汇编子程序

C中用extern int delay(int time);

汇编中用EXPORT delay。

2.C程序访问汇编全局变量

C中用extern int DELAYVAL;

汇编中用EXPORT DELAYVAL。

3.汇编中调用C子程序

汇编中用IMPORT xmain;

C中不用导出。

4.汇编访问C全局变量

汇编中IMPORT i;

C中不用导出。

5.C中嵌入汇编

__asm

{

  汇编指令

}