ARM汇编指令

来源:互联网 发布:淘宝中小卖家生存现状 编辑:程序博客网 时间:2024/04/28 13:10

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寄存器中()
                         ;存储指针在加载第一个值之后增加
                          ;增长方向为向上增长(! : 表示同时更新寄存器的值)





 

0 0
原创粉丝点击