您的位置:首页 > 其它

ARM汇编指令

2014-11-10 21:10 246 查看
ARM汇编指令
ARM处理器的指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产生指令6大指令。

1.数据处理指令

1)数据传送指令

2) 算术逻辑运算指令
3)比较指令

==>数据处理指令,按照寻找方式分类(主要掌握三类)

1)立即数寻址

2)寄存器寻址

3)寄存器偏移寻址

2)寄存器寻址

3)寄存器偏移寻址

数据处理指令只能对寄存器的内容进行操作,而不能对内存中的数据进行操作。所有ARM数据处理指令均可选择使用S后缀,并影响状态标志。比较指令CMP、CMN、TST和TEQ不需要后缀S,它们会直接影响状态标志。

常见指令集:

数据传送指令

例:

mov r1,r2 ;将寄存器 R0 的值传送到寄存器 R1

mov r0,#0x3 ; r0 = 0x3

mov r1,r0 ; r1 = r0

mov r1, r0 ,lsl #3 ;将寄存器 R0 的值左移 3 位后传送 到R1 。

MOVS R2,#0x10 ;R2= #0x10,并影响标志位。

MVNS R2,#0xFF ;R2=0Xffff00,并影响标志位。

MVN R0 ,#0;将立即数 0 取反传送到寄存器 R0 中,完成后R0=-1。

算术运算指令

ADD +

SUB -

======>最常见的两个算术运算

ADDR1,R2,R3 ; R1 = R2 +R3

SUB R1,R2,R3 ; R1 =R2 - R3

subs r3,r1,r2 ; r3 =r1-r2,并且影响cpsr标志位

逻辑运算

AND R0 ,R0 ,#3 ;该指令保持 R0 的 0 、1 位,其余位清零(重要)

1.取出第0位上的数据

MOV R0,#0x13

AND R0,#0x1

ORR R0 ,R0 ,#3 ;该指令设置 R0 的 0 、1 位,其余位保持不变

只要有一个为1 ==》1

置某位值;

1.将R0,的第0位置"1"

MOV R0,#0x12 (.......0001 0010)

ORR R0,#0x1

2.将R0,的低四位置"1"

MOV R0,#0x12 (.......0001 0010)

ORR R0,#0x0F

EOR R0 ,R0 ,#3 ;该指令反转 R0 的 0 、1 位,其余位保持不变

BIC R0,R0,#0x1F;该指令清除 R0 中低5位,其余的位保持不变

寄存器寻址方式:

操作数的值在寄存器中,指令中的地址码编号指出的是寄存器编号,指令执行时直接取出寄存器值来操作。

如:

mov
r1,r2 ;将r2的值存入r1

sub
r0,r1,r2 ;将r1的值减去r2的值,结果保存到r0

2.Load/Store访存指令

1)单寄存器操作指令

单寄存器加载指令

助记符

说明

操作

条件码位置

LDR Rd,addressing

加载字数据

Rd←[addressing],addressing索引

LDR{cond}

LDRB Rd,addressing

加载无符号字节数据

Rd←[addressing],addressing索引

LDR{cond}B

LDRT Rd,addressing

以用户模式加载字数据

Rd←[addressing],addressing索引

LDR{cond}T

LDRBT Rd, addressing

以用户模式加载无符号字节数据

Rd←[addressing],addressing索引

LDR{cond}BT

LDRH Rd, addressing

加载无符号半字数据

Rd←[addressing],addressing索引

LDR{cond}H

LDRSB Rd, addressing

加载有符号字节数据

Rd←[addressing],addressing索引

LDR{cond}SB

LDRSH Rd, addressing

加载有符号半字数据

Rd←[addressing],addressing索引

LDR{cond}SH

mov r3,#0x45 ;r3 = 0x45

mov r2,#0x40000000 ;r2 = 0x40000000(地址)
str r3,[r2,#4] ;把r3中的数据写入r2寄存器中地址为0x40000000存储空间上

mov r1,#0xFF ;r1 = 0xFF
mov r3,#0x45 ;r3 = 0x45

mov r2,#0x40000000 ;r2 = 0x40000000(地址)

str r3,[r2,#4] ;把r3中的数据写入r2寄存器中地址为0x40000000存储空间上

mov r1,#0xFF ;r1 = 0xFF

ldr r1,[r2,#4] ;从r2寄存器上地址0x40000000处偏移4个字节0x40000004处,读取数据,存入到寄存器r1中
mov r4,#12 ;r4 = 12
ldr r1,[r2,r4] ;从r2寄存器上地址0x40000000处偏移r4中数据12个字节 ==》0x4000000c处,读取数据,存入到寄存器r1中
前后索引:

LDR r0,[r1,r2]

STR Rd, [Rbase, Rindex]! 存储 Rd 到 Rbase + Rindex 所合成的有效地址,

并且把这个新地址写回到 Rbase。

STR Rd, [Rbase, #index]! 存储 Rd 到 Rbase + index 所合成的有效地址,

并且并且把这个新地址写回到 Rbase。

多寄存器操作指令:

LDMIA R1!,{R2-R4,R6}

LDMIA R1!,{r4,r3,R6,r2}

;将R1指向的存储单元中的数据读出到

;R2、R3、R4、R6寄存器中()

;存储指针在加载第一个值之后增加

;增长方向为向上增长(! : 表示同时更新寄存器的值)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: