微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > arm汇编编程(示例)

arm汇编编程(示例)

时间:11-09 来源:互联网 点击:

接操作数前缀

\为换行符

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|

-----------------------------------------------------------

对应输入的一条指令为:

{}{s},,

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内存储索

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top