现在的位置: 首页 > 综合 > 正文

ARM学习笔记(四)

2013年02月03日 ⁄ 综合 ⁄ 共 3299字 ⁄ 字号 评论关闭

ARM指令集的概要介绍

ARM指令集的分类

跳转指令

数据处理指令

程序状态寄存器(PSR)传输指令

Load/Store指令

协处理器指令

异常中断产生指令

ARM指令的语法格式

<opcode>[cond][S] <Rd>,<Rn>,<shifter_operand>

其中:

Opcode:指令助记符;

[cond]:可选的指令执行条件;

[S]:决定指令的操作是否影响CPSR的值;

<Rd>:目标寄存器;

<Rn>:表示包含第一个操作数的寄存器;

<shifter_operand>:表示第二个操作数。

ARM指令的编码格式

ARM指令字长固定为32位,一条典型的ARM指令的编码格式如下:

31    28

27    25

24    21

20

19    16

15    12

11     8

7      0

cond

001

opcode

S

Rn

Rd

shifter_operand

 

ARM指令的条件码域

大多数ARM指令都可以根据CPSR中的标志位的值来决定是否执行该指令。ARMV5以前所有指令都是条件执行的,从ARMV5以后引入了一些必须无条件执行的指令。

 

每一条ARM指令可以包含四位的条件码,条件码共有16个,各条件吗的助记符及含义如下:

条件码(cond)

条件码助记符

含义

CPSR中条件标志位的值

0b0000

EQ

相等(Equal)

Z==1(Z set)

0b0001

NQ

Not equal

Z==0(Z clear)

0b0010

CS/HS

Carry Set/unsigned higher or same

无符号数大于/等于

C==1(C set)

0b0011

CC/LO

Carry clear/unsigned lower

无符号数小于

C==0(C clear)

0b0100

MI

Minus/negative(负数)

N==1

0b0101

PL

Plus/positive or zero(非负数)

N==0

0b0110

VS

Overflow(上溢出)

V==1

0b0111

VC

No overflow(没有上溢出)

V==0

0b1000

HI

Unsigned higer(无符号数大于)

C==1 and Z==0

0b1001

LS

Unsigned lower or same

C==0 and Z==1

0b1010

GE

Signed greater than or equal

N==V

(N==1 and V==1

     or

N==0 and V==0)

0b1011

LT

Signed less than

N!=V

0b1100

GT

Signed greater than

Z clear, and either N set and V set ,or N clear and V clear(Z==0,N==V)

0b1101

LE

Signed less than or equal

Z==1 or N!=V

0b1110

AL

Always(unconditional)无条件执行

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

0b1111

AV

该指令从不执行

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

 

ARM指令寻址方式

1. 数据处理指令的操作数的寻址方式

2. 字及无符号字节的Load/Store指令的寻址方式

3. 杂类Load/Store指令的寻址方式

4. 批量Load/Store指令的寻址方式

5. 协处理器Load/Store指令的寻址方式

 

数据处理指令中的的操作数的寻址方式

<opcode>[cond][S] <Rd>,<Rn>,<shifter_operand>

Shifer_operand有三种表示方式:立即数方式,寄存器方式,寄存器移位方式。

 

立即数方式,每个立即数由一个8位的常数循环右移偶数位得到。其中循环右移的位数由一个4位二进制数的2倍表示。如立即数记作<immediate>8位常数记作immed_8,四位循环右移的常数记作rotate_imm,则有:

Immediate = immed_8 循环右移 (2 * rotate_imm)

  这样并不是每一个32位常数都是合法的立即数,只有通过以上方法构造的才是合法的立即数。

  一个合法的立即数可以有多种编码方法(取不同的immediateimmed_8),由于循环右移会影响CPSRC标志位值,因此同一个合法的立即数采用不同的编码方式将使不某些指令产生不同的执行结果,这是不允许的,因此ARM处理器对立即数采用了如下的编码方式:

      当立即数值在00xFF之间时,令immed_8=<immediate>rotate_imm=0

      其它情况下编译器使用rotate_imm最小的编码方式。

 

ARM指令系统

 

一.跳转指令

ARM中有两种方式可以实现程序的跳转,一种是跳转指令,另一种是直接向PC(R15)中写入目标地址。后一种方式可以实现在4GB的地址空间中任意跳转,前一种方式可以实现在当前指令前后32M的地址空间中任意跳转。

 

四种跳转指令:

1.  B:跳转指令;

2.  BL:带返回的跳转指令(跳转前将PC值保存在LR(R14)中用于返回);

3.  BLX:带返回和状态切换的跳转指令;

4.  BX:带状态切换的跳转指令。

 

BBL(用于子程序调用)

  指令语法格式B[L][cond] <target_address>

  指令编码格式

31

28

27

26

25

24

23            0

cond

1

0

1

L

signed_immed_24

  L决定是否保存返回值地址,有时保存PC值于LR(R14)中,无时不保存。

  target address:指令跳转的目标地址。其计算方法是将指令中的24位带符号数的补码立即数扩展为32(扩展符号位),将此32位数左移2位,将得到的值加到PC寄存器中得到的即为跳转的目标地址(由此可知跳转范围为-32M-+32M(223*2*2))。

  指令操作的伪代码:

      If ConditionPassed(cond) then

         If L==1 then

            LR=address of the instruction after the branch instruction

            PC=PC+(SignExtend(Sign_immed_24) << 2)

         …..

BLX <target_address>:跳转到目标地址,将程序状态切换为Thumb状态,复制PCLR,用于从ARM指令中调用Thumb子程序…..

BX <target_address>:目标地址处的指令可以是ARM指令也可以是Thumb指令,目标地址为<target_address>0xFFFFFFFF做与操作的结果,目标地址处的指令类型由Rmbit[0]决定。

二.数据处理指令

数据传送指令用于向寄存器中传入一个常数;

算数逻辑运算指令

比较指令不保存运算结果,只更新CPSR中相应的条件标志位。

 

数据处理指令包括:

MOV 数据传送指令

MVN 数据求反传送指令

CMP 比较指令

CMN 基于相反数的比较指令

TST 位测试指令

TEQ 相等测试指令

ADD 加法指令

SUB 减法指令

RSB 逆向减法指令

ADC 带位加法指令

SBC 带位减法指令

RSC 带位逆向减法指令

AND 逻辑与

BIC 位清除

EOR 逻辑异或操作指令

ORR 逻辑或操作指令

 

1.       MOV(P75)

Syntax formatMOV[cond][S] Rd<shifter_operand>

Coding format

31    28

27    25

24    21

20

19    16

15    12

11     8

7      0

cond

001

1101

S

SBZ(0)

Rd

shifter_operand

 

The MOV(MOVE) instruction moves the value of <shifter_operand> to the destination register <Rd>.The condition code flags are optionally updated,based on the result and the S bit.

Operation:

  If ConditionPassed(cond) then

     Rd = shifter_operand

     If S == 1 and Rd == R15 then

       

抱歉!评论已关闭.