您的位置:首页 > 其它

ARM指令学习2

2012-09-04 11:13 155 查看
指令集介绍

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/STMIA、LDMIB/STMIB、LDMDA/STMDA、LDMDB/STMDB进行读取和存储


进行堆栈操作操作时要先设置堆栈指针(SP),然后使用堆栈寻址指令STMFD/LDMFD、STMED/LDMED、STMFA/LDMFA和STMEA/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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: