arm汇编编程(示例)
接操作数前缀
\为换行符
ENTRY为程序的入口
END为程序的结束
//*arm体系结构第二天*
二、ARM的寻址方式
最简单的汇编指令格式是操作码和操作数
如:MOVr0,#10
操作码:即CPU指令如MOVADD
操作数:即表示数据是在寄存器中还是在内存中,是绝对地址还是相对地址
操作数部分要解决的问题是,到哪里去获取操作数,获取操作数的方式就是寻址方式。
ARM每一条指令都是32位机器码,对应CPU的位数
ARM指令格式:
在32位中分为7个位域,每个位域分别存储不同意义的编码(二进制数)
31~2827~2524~212019~1615~1211~0
-----------------------------------------------------------
|Cond|001|Opcode|S|Rn|Rd|Operand2|
-----------------------------------------------------------
对应输入的一条指令为:
Opcode:指令操作码用4个位存储,如MOV,ADD每一个操作码和操作数最终都是以二进制形式存在
Cond:指令的条件码用4个位来储,可省略
如:ADDr0,r0,#1;计算r0加1后的值,再写入到r0内
ADDEQr0,r0,#1;只有在CPSR寄存器条件标志位满足指定条件时,才计算r0加1后的值,再写入到r0内
其中条件助记符如下:
EQ相等
NE不相等
MI负数
VS溢出
PL正数或零
HI无符号大于
LS无符号小于或等于
CS无符号大于或等于
CC无符号小于
GT有符号大于
GE有符号大于或等于
LE有符号小于或等于
LT有符号小于
AL无条件执行
S:决定指令的操作是否影响CPSR的值,用一个位存储,省略则表示为0值,否则为1值
如SUBSR0,R0,#1;R0减1,结果放入R0,同时响影CPSR的值
SUBR0,R0,#1;R0减1,结果放入R0,不影响CPSR的值
Rd:目标寄存器编码用4位存储
Rn:第1个操作数的寄存器编码用4位存储
Operand2:第2个操作数用12位存储
寻址方式:是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式,共8种寻址方式:
寄存器寻址、立即寻址、寄存器间接寻址、基址寻址、多寄存器寻址、堆栈寻址、相对寻址、寄存器移位寻址
//*寻址方式是重点需要理解背讼*
1.立即寻址
操作数是常量,用#表示常量。例
MOVR0,#0xFF000;指令省略了第1个操作数寄存器。将立即数0xFF000(第2操作数)装入R0寄存器
SUBR0,R0,#64;R0减64,结果放入R0
#表示立即数0x或&表示16进制数否则表示十进制数
立即数寻址指令中的地址码就是操作数本身,可以立即使用的操作数。
其中,#0xFF000和#64都是立即数。该立即数位于32位机器码中,占低位的12位。也就是说在ARM指令中以12位存储一个数据
那么,32位的数据(long或float)如何存储?
32位的数据以一种特殊的方式来处理
其中:高4位表示的无符号整数
低8位补0扩展为32位,然后循环右移x位来代表一个数。x=高4位整数*2
所以,不是每一个32位数都是合法的立即数,只有能通过上述构造得到的才是合法的立好数。如:
合法立即数:0xff,0x104,0xff0
不合法立即数:ox101,0x102,0xff1
2.寄存器寻址
操作数的值在寄存器中,指令执行时直接取出寄存器值来操作
例:MOVR1,R2;将R2的值存入R1在第1个操作数寄存器的位置存放R2编码
SUBR0,R1,R2;将R1的值减去R2的值,结果保存到R0在第2操作数位置,存放的是寄存器R2的编码
寄存器寻址是根据寄存器编码获取寄存器内存储的操作数
3.寄存器间接寻址
操作数从寄存器所指向的内存中取出,寄存地存储的是内存地址
例:LDRR1,[R2];将R2指向的存储单元的数据读出,保存在R1中R2相当于指针变量
STRR1,[R2];将R1的值写入到R2所指向的内存
SWPR1,R1,[R2];将寄存器R1的值和R2指定的存储单元的内容交换
[R2]表示寄存器所指向的内存,相当于*p
LDR指令用于读取内存数据
STR指令用于写入内存数据
//-----------------------------------------------------
4.寄存器基址寻址
操作数从内存址偏移后读取数据。常用于查表、数组操作、功能部件寄存器访问等。
基址:相当于首地址,地址偏移后取值作为操作数
基址寄存器:用来存放基址的寄存器
变址寻址:基址寻址也称为变址寻址
1)前索引寻址
例:LDRR2,[R3,#4];读取R3+4地址上的存储单元的内容,放入R2
LDRR2,[R3,#4]!;读取R3+4地址上的存储单元的内容,放入R2,然后R3内的地址变为R3+4,即R3=R3+4
[R3,#4]表示地址偏移后取值,相当于*(p+4)或p[4],R3内保存的地址不变
[R3,#4]!表示地址偏移后取值,相当于*(p+4)或p[4],!表示回写,即R3=R3-4,R3的值发生了改变
2)后索引寻址
例:LDRR2,[R3],#4;先读取R3地址上的存储单元的内容,放入R2,然后R3内的地址变为R3+4,即R3=R3+4
[R3],#4类似于*p++只不过自加的不是1,而是指定的4
[R3,#4]!类似于*++p只不过自加的不是1,而是指定的4
3)寄存器的值作索引
例:LDRR2,[R3,R0];R0内存储索
arm汇编编 相关文章:
- ARM汇编编程基础之四-ARM汇编伪操作(11-27)
- ARM汇编编程基础之三-基本寻址方式与基本指令(11-27)
- ARM汇编编程基础之一-寄存器(11-27)
- ARM汇编编程基础之五-ADS开发环境的使用(11-27)
- ARM汇编编程基础之二-流水线对PC值的影响(11-27)
- ARM汇编编程基础之六-其它寻址模式与其它指令(11-27)