ARM指令学习2

指令集介绍


ARM是三地址指令格式:

        1.          <opcode>   {<cond>}  {s}   <Rd> , <Rn>  {,operand2}

                              <>内是必须的, {}是可选的。

                              opcode :指令助记符;cond:执行条件;

                              S:是否影响CPSR寄存器的值

                              Rd:目标寄存器;Rn:第一个操作数寄存器:operand2:第二个操作数

        2.条件码

                      cond:可以实现高效的逻辑操作(节省跳转和条件语句),提高代码效率

不标明条件代码,将默认认为无条件(AL)执行

指令条件码表:

操作码

条件助记符

标志

含义

0000

EQ

Z=1

相等

0001

NE

Z=0

不相等

0010

CS/HS

C=1

无符号数大于或等于

0011

CC/LO

C=0

无符号数小于

0100

MI

N=1

负数

0101

PL

N=0

正数或零

0110

VS

V=1

溢出

0111

VC

V=0

没有溢出

1000

HI

C=1,Z=0

无符号数大于

1001

LS

C=0,Z=1

无符号数小于或等于

1010

GE

N=V

有符号数大于或等于

1011

LT

N!=V

有符号数小于

1100

GT

Z=0,N=V

有符号数大于

1101

LE

Z=1,N!=V

有符号数小于或等于

1110

AL

任何

无条件执行 (指令默认条件)

1111

NV

任何

从不执行(不要使用)

 

 例如:

     

if(a>b)
   a+=2;
else
   b+=3;
对于的ARM汇编:


    

CMP   R0,R1
ADDHI  R0,R0,#2
ADDLS  R1,R1,#3

2.存储器访问指令

   ARM处理器是典型的RISC处理器。对存储器的访问只能使用加载和存储指令实现

   ARM处理器是冯诺依曼存储结构,RAM,I/O、程序数据的访问都要通过加载和存储指令。

2.1 分类:

      a 单存储操作指令

助记符

说明

操作

条件码位置

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

---LDR和STR----字加载/存储指令

    例:

         LDR  R1,[R0,#0x12]

         LDR R1,[R0,R2]

         LDR R1,[R0,-R2]


        LDR R1,[R0,R2,LSL #2]

 从寻址方式的地址计算方法分,加载/存储指令有以下4中格式:

       1.零偏移。   LDR Rd,[Rn]

       2.前索引偏移     LDR Rd,[Rn,#0x04]!

       3,程序相对偏移  LDR Rd,label

       4,后索引偏移    LDR  Rd,[Rn],#-0x04

     

  示例:

      LDR R2,[R5];将R5指向地址的字数据存入R2

     LDRB  R3,[R2],#-1;R2指向的直接数据存入R3,R2-=1;

     STRH  R1,[R0,#2]!; 将R1的半字数据保存到R0+2地址;值修改低2字节数据,然后R0=R0+2

    

      b.多存储操作指令

助记符

说明

操作

条件码位置

LDM{mode}  Rn{!},reglist

多寄存器加载

reglist←[Rn...],Rn回写等

LDM{cond}

{mode}

STM{mode}  Rn{!},reglist

多寄存器存储

[Rn...]←reglist,Rn回写等

STM{cond}

{mode}


多寄存器加载/存储指令可以实现在一组寄存器和一块连续的内存单元之间传输数据。LDM为加载多个寄存器;STM为存储多个寄存器。允许一条指令传送16个寄存器的任何子集或所有寄存器。它们主要用于现场保护、数据复制、常数传递等。

模式

说明

模式

说明

IA

每次传送后地址加4

FD

满递减堆栈

IB

每次传送前地址加4

ED

空递减堆栈

DA

每次传送后地址减4

FA

满递增堆栈

DB

每次传送前地址减4

EA

空递增堆栈

数据块传送操作

堆栈操作

进行数据复制时,先设置好源数据指针和目标指针,然后使用块拷贝寻址指令LDMIA/STMIALDMIB/STMIBLDMDA/STMDALDMDB/STMDB进行读取和存储 。

进行堆栈操作操作时要先设置堆栈指针(SP),然后使用堆栈寻址指令STMFD/LDMFDSTMED/LDMEDSTMFA/LDMFASTMEA/LDMEA实现堆栈操作。

3.寄存器和存储器交换指令

   

助记符

说明

操作

条件码位置

SWP     Rd,Rm,Rn

寄存器和存储器字数据交换

Rd←[Rn],[Rn]←Rm (Rn≠Rd或Rm)

SWP{cond}

SWPB    Rd,Rm,Rn

寄存器和存储器字节数据交换

Rd←[Rn],[Rn]←Rm (Rn≠Rd或Rm)

SWP{cond}B



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值