Android基础知识 — 1.3-ARM和Thumb指令详解1

Thume指令可以理解为ARM指令集的一个子集

1. 指令格式

ARM指令的基本格式:

<opcode>{<cond>}{S}{.W|.N}<Rd>,<Rn>{,<operand2>}

opcode:为指令助记符,如MOV,ADD等.

cond:为执行条件

条件码助记符      标志
EQ               Z=1          @相等
NE               Z=0          @不相等
CH/HS            C=1          @无符号数大于或等于
CC/LO            C=0          @无符号数小于
MI               N=1          @负数
PL               N=0          @正数或零
VS               V=1          @溢出
VC               V=0          @没有溢出
HI               C=1,Z=0      @无符号大于
LS               C=0,Z=1      @无符号小于或等于
GE               N=V          @有符号数大于或等于
LT               N!=V         @有符号数小于
GT               Z=0,N=V      @有符号数大于
LE               Z=1,N!=V     @有符号数大于或等于
AL               任何         @无条件执行(默认)

S:指令是否影响CPSR寄存器的值,如ADDS,SUBS等

.W与.N为指令宽度说明符,编码默认是16位,也可以是32位则需要为指令加上.W宽度说明

Rd:为目的寄存器、

Rn:为第一个操作数寄存器

operand2:为第二个操作数,可以是立即数、寄存器、寄存器移位操作。如 MOV R0, #2

2. 跳转指令

(1)B跳转指令 : B {cond} label

  (2)  BL带链接的跳转指令: BL {cond} label

  (3)  BX带状态切换跳转指令: BX {cond} Rm, 如果cond条件满足,则处理器会判断Rm的位[0]是否为1,则跳转时自动将CPSR寄存器的标志T置位,反之,标志T复位

 (4)BLX带链接和状态切换的跳转指令: BLX {cond} Rm

3. 存储器访问指令

存储器访问操作包括从存储器中加载数据、存储数据到存储器、寄存器与存储器之间数据交换

LDR: 用于从存储器中加载数据到寄存器中,格式如下:

LDR{type}{cond} Rd, label

LDRD{cond} Rd, Rd2, label

LDRD R0, R1, label2 @从label2指向的内存加载2个字的数据到R0和R1寄存器中

STR: 用于存储数据到指定地址的存储单元中,格式如下:

STR{type}{cond} Rd, label

STRD{cond} Rd, Rd2, label

STR R0, [R2, #04] @将R0寄存器的数据存储到R2+4所指向的存储单元

LDM:用于从指定的存储单元加载多个数据到一个寄存器列表,格式如下:

LDM{addr_mode}{cond} Rn{!} reglist

LDMIA R0!, {R1-R3} @依次加载R0指向的存储单元的数据到R1、R2、R3寄存器。 
                   @R0为基寄存器,用于存储初始地址, !为可选,有!则最终地址将写回R0寄存器中

 STM:将一个寄存器列表的数据存储到指定的存储单元,格式如下:

STM{addr_mode}{cond} Rn{!}  reglist

STMDB R1!, {R3-R6, R11} @将R3-R6,R11寄存器的内容存储到R1指向的存储单元
STMFD SP!, {R3-R7}      @将R3-R7寄存器压入堆栈

PUSH:将寄存器推入满递减堆栈,格式如下:

PUSH{cond} reglist

PUSH {r0, r4-r7}  @将R0/R4-R7寄存器内容压入堆栈

POP:从满递减堆栈中弹出数据到寄存器,格式如下:

POP{cond} reglist

POP {r0, r4-r7}  @R0,R4-R7寄存器内容压入堆栈

SWP:用于寄存器与存储器之间的数据交换,格式如下:

SWP{B}{cond} Rd, Rm, [Rn]

SWP R1, R1, [R0]  @将R1寄存器与R0指向的存储单元的内容进行交换

猜你喜欢

转载自blog.csdn.net/qincheng168/article/details/128275609