ARM处理器寄存器和汇编指令系统.docx

上传人:b****8 文档编号:9402647 上传时间:2023-05-18 格式:DOCX 页数:14 大小:22.19KB
下载 相关 举报
ARM处理器寄存器和汇编指令系统.docx_第1页
第1页 / 共14页
ARM处理器寄存器和汇编指令系统.docx_第2页
第2页 / 共14页
ARM处理器寄存器和汇编指令系统.docx_第3页
第3页 / 共14页
ARM处理器寄存器和汇编指令系统.docx_第4页
第4页 / 共14页
ARM处理器寄存器和汇编指令系统.docx_第5页
第5页 / 共14页
ARM处理器寄存器和汇编指令系统.docx_第6页
第6页 / 共14页
ARM处理器寄存器和汇编指令系统.docx_第7页
第7页 / 共14页
ARM处理器寄存器和汇编指令系统.docx_第8页
第8页 / 共14页
ARM处理器寄存器和汇编指令系统.docx_第9页
第9页 / 共14页
ARM处理器寄存器和汇编指令系统.docx_第10页
第10页 / 共14页
ARM处理器寄存器和汇编指令系统.docx_第11页
第11页 / 共14页
ARM处理器寄存器和汇编指令系统.docx_第12页
第12页 / 共14页
ARM处理器寄存器和汇编指令系统.docx_第13页
第13页 / 共14页
ARM处理器寄存器和汇编指令系统.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

ARM处理器寄存器和汇编指令系统.docx

《ARM处理器寄存器和汇编指令系统.docx》由会员分享,可在线阅读,更多相关《ARM处理器寄存器和汇编指令系统.docx(14页珍藏版)》请在冰点文库上搜索。

ARM处理器寄存器和汇编指令系统.docx

ARM处理器寄存器和汇编指令系统

ARM处理器寄存器和汇编指令系统

1.ARM的处理器模式

ARM体系结构支持7种处理器模式,分别是:

用户、FIQ、IRQ、管理、中止(abort)、未定义和系统模式。

除了用户模式外,其余都称之为特权模式。

除了用户和系统模式外,其余都称之为异常模式。

 

2.ARM的存储器组织

ARM处理器总共有37个寄存器:

包括31个通用寄存器、包括程序计数器(PC)、和6个状态寄存器。

这些寄存器在不同模式下,不能被同时看到,有些名称是重叠的。

分为三类:

不分组寄存器,分组寄存器和程序计数器

1)不分组寄存器R0~R7

所有的处理模式下、它们都是访问同一个寄存器,因此只有8个不分组寄存器。

2)分组寄存器R8~R14

每一个访问的物理寄存器取决于当前的处理器模式,有些是共用的,而有些事分离的。

具体可以查询相关资料。

R13就是堆栈寄存器SP,而R14就是链接寄存器LR

3)程序计数器R15

在ARM状态PC的位[1:

0]为0,而在Thumb状态,位[0]为0.

4)程序状态寄存器CPSR和程序状态保存寄存器SPSR

CPSR只有一个,代表了当前的程序状态。

而每个异常模式都有独立的一个SPSR,用于保存CPSR的状态。

1

31  30  29  28                                8  7  6  5   4   3   2   1   0 

2

 N   Z  C    V           DNM(RAZ)              I  F  T   M4 M3 M2 M1 M0

 

3.ARM的常用汇编指令

1)基本寻址方式

包括有寄存器寻址、立即寻址、寄存器移位寻址、寄存器间寻址、变址寻址、多寄存器寻址、堆栈寻址、块复制寻址和相对寻址

2)条件执行

几乎所有的ARM指令都可以包含一个可选的条件码,句法中以{cond}来标识。

可用的条件码如下面所示。

几乎所有的ARM数据处理指令均可以根据执行结果来选择是否更新条件码标志,即在指令中包含后缀S。

 1

操作码[31:

28]      助记符后缀   标 志                 含义

 2

0000                 EQ           Z置位                相等

 3

0001                NE            Z清零                不等

 4

0010                CS/HS       C置位                大于或等于(无符号>=)

 5

0011                CC/LO       C清零                小于(无符号<)

 6

0100               MI            N置位                 负

 7

0101                PL            N清零                 正或零

 8

0110                VS           V置位                 溢出

 9

0111                VC           V清零                 未溢出

10

1000                HI           C置位且Z清零        大于(无符号>)

11

1001                LS           C清零或Z置位        小于或等于(无符号<=)

12

1010               GE            N和V相同            带符号>=

13

1011               LT            N和V不同             带符号<

14

1100               GT            Z清零且N和V相同     带符号>

15

1101               LE            Z置位或N和V不同     带符号<=

16

1110               AL            任何                    总是(通常省略) 

 

3)存储器访问指令

3.1)LDR和STR(字与无符号字节)语法如下

1

op {cond} {B} {T} Rd, [Rn]

2

op {cond} {B} Rd, [Rn, Flexoffset] {!

} //前索引偏移

3

op {cond} {B} Rd, label

4

op {cond} {B} {T} Rd, [Rn], Flexoffset//后索引偏移

其中:

op是操作码即指令LDR或STR。

cond就是上面所说的条件码,因此指令可以变成LDREQ或STRNE类似的名称,表示满足某些条件时该条指令才会执行。

B可选后缀,表示传送Rd的最低有效字节,就是所谓的无符号字节传送,字节加载的时候是用'0'来扩展到32位的。

T可选后缀,即使处理器是在特权模式下,存储系统也将访问看成是处理器在用户模式下。

不能和前索引偏移一起使用。

Rd用于加载或存储的ARM寄存器

Rn存储器的基址寄存器。

若指令是带写回的前索引或后索引(后索引都是写回的),则Rd和Rn不能相同

Flexoffset加到Rn上的灵活的偏移量

label程序相对偏移表达式。

label必须是当前指令的+-4KB范围内

!

可选后缀,前索引写回标志,若Rn是R15,则不能用后缀!

Flexoffset的句法包括下面两种

 1

#expr

 2

{-} Rm {, shift} 

    - 是可选符号,表示从Rn中减去偏移量,否则是加

  

expr 表达式,取值范围-4095~+4095的整数

  

Rm 内含偏移量的寄存器。

Rm不允许是R15

  

shift Rm的可选移位方法,可以是下列形式的任何一种

  

    ASR n算术右移n位(1<=n<=32)

  

    LSL n逻辑左移n位(0<=n<=31)

 

     LSR n逻辑右移n位(1<=n<=32)

  

    ROR n循环右移n位(1<=n<=31)

  

    RRX 循环右移1位,带扩展

 

3.2)LDR和STR(半字和带符号字节)语法如下:

1

op {cond} type Rd, [Rn]

2

op {cond} type Rd, [Rn, offset] {!

}

3

op {cond} type Rd, label

4

op {cond} type Rd, [Rn], offset

其中:

type必须是以下所列其中之一

   SH对带符号半字(仅LDR)

   H对无符号半字

   SB对带符号字节(仅LDR)

label程序相对偏移表达式。

必须是当前指令+-255字节范围

offset加在Rn上的偏移量,可以是以下两种形式之一

    #expr  //值为+-255范围内的整数。

    {-}Rm

 

3.3)LDR和STR(双字)加载两个相邻的存储器和存储两个相邻的寄存器,语法如下:

1

op {cond} D Rd, [Rn]

2

op {cond} D Rd, [Rn, offset] {!

}

3

op {cond} D Rd, label

4

op {cond} D Rd, [Rn], offset

其中:

Rd加载或存储寄存器其中一个,另一个是R(d+1)。

但Rd必须是偶数寄存器,且不能是R14。

Rn除非指令为零偏移,或不带写回的前索引,否则Rn不允许与Rd和R(d+1)相同

offset加在Rn上的偏移量

label程序相对偏移表达式。

必须是当前指令+-255字节范围

 

3.4)LDM和STM加载多个寄存器或存储多个寄存器,可以传送R0~R15的任何组合

1

op {cond} mode Rn{!

}, reglist{^}

其中:

mode是下列情况中之一:

   IA每次传送后地址加1

   IB每次传送前地址加1

   DA每次传送后地址减1

   DB每次传送前地址减1

   FD满递减堆栈

   ED空递减堆栈

   FA满递增堆栈

   EA空递增堆栈

Rn基址寄存器,传送数据的初始地址。

不允许是R15

!

可选后缀。

若有!

,则最后的地址写回Rn

reglist加载或存储的寄存器列表可以写出如下形式

     {R0,R2,R9}

     {R3-R6,R11,R12}

     {R0,R4-R7,LR}

 

3.4)SWP 在寄存器和存储器之间进行数据交换。

1

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

其中:

B可选后缀。

若有B,则是交换字节,否则交换字

Rd数据从存储器加载到Rd

RmRm的内容存储到存储器。

如果Rm和Rd的相同,则是交换寄存器和存储器的内容

RnRn的内容指定要进行数据交换的存储器的地址。

Rn必须和Rm和Rd不同

 

4)ARM数据处理指令

4.1)灵活的第二操作数,在数据处理指令中会经常出现第二操作数,即Operand2,它有如下的两种可能形式。

1

# immed_8r

2

Rm{, shift}

其中:

immed_8r取值为数字常量的表达式。

常量必须对应8位位图在32位字中被循环移位偶数位(0,2,4,6,...,28,30)后的值

             合法的常量有:

0xFF,0x104,0xFF0,0xFF000,0xF0000000F等

             非法的常量有:

0x101,0x102,0xFF1,0xFF04等

Rm  存储第二操作数数据的寄存器,可以用各种方法对寄存器中的位图进行移位或循环移位,操作结果用于Operand2

      但Rm本身不改变。

shift 对Rm的可选移位方法,可以是以下方法的任何一种

  

    ASR n算术右移n位(1<=n<=32)

  

    LSL n逻辑左移n位(0<=n<=31)

 

     LSR n逻辑右移n位(1<=n<=32)

  

    ROR n循环右移n位(1<=n<=31)

  

    RRX 循环右移1位,带扩展

        typeRs其中type为上面ASR、LSL、LSR、ROR中的一种;Rs为提供移位量的寄存器,仅使用最低有效字节

4.2)ADD、SUB、RSB、ADC、SBC和RSC

1

op {cond} {S} Rd, Rn, Operand2

其中:

op   是上面众多指令中的一个

S     可选后缀,会根据结果来更新条件码标志

Rd    结果寄存器

Rn    保存第一操作数的寄存器

Operand2  第二操作数

 

ADD表示Rn加Operand2的值存到Rd

SUB表示Rn减去Operand2

RSB表示Operand2减去Rn

ADC将Rn和Operand2相加后再加上进位标志

SBC从Rn的值中减去Operand2的值,若进位标志是清零的,则结果减去1

RSC从Operand2中减去Rn的值,若进位是清零的,则结果减去1

4.3)AND、ORR、EOR和BIC

1

op {cond} {S} Rd, Rn, Operand2

其中:

AND是与、ORR是或、EOR是异或和BIC是位清零

都是Rn和Operand2中的值做处理,然后结果保存在Rd中

BIC用于将Rn中的位于Operand2中相应位的反码,进行与操作。

4.3)MOV和MVN传送与传送非

1

MOV {cond} {S} Rd,Operand2

2

MVN {cond} {S} Rd,Operand2

MOV将Operand2中的值拷贝到Rd中

而MVN将Operand2的值进行按位逻辑非之后再传送到Rd

4.4)CMP和CMN比较与比较反值

1

CMP {cond} Rn, Operand2

2

CMN {cond} Rn, Operand2

CMP比较大小,从Rn中减去Operand2的值,但丢弃结果,更新标志位,指令的主要目的是更新标志位

CMN是将Rn和Operand2相加,丢弃结果再更新标志位。

4.5)TST和TEQ测试和测试相等

1

TST {cond} Rn, Operand2

2

TEQ {cond} Rn, Operand2

TST对Rn和Operand2的值进行按位与操作,更新标志位,丢弃结果

TEQ对Rn和Operand2的值进行异或操作,更新标志位,丢弃结果

4.6)CLZ前导零计数

1

CLZ {cond} Rd, Rm

Rd结果寄存器,不允许是R15

Rm操作数寄存器。

CLZ对Rm中的前导零的个数进行计数,结果放在Rd中,若Rm全为0,则结果为32

    若位[31]是1,则结果为0

4.7)MUL和MLA乘法和乘加运算

1

MUL {cond} {S} Rd,Rm,Rs

2

MLA {cond} {S} Rd,Rm,Rs,Rn

其中:

Rd   结果寄存器,不能使R15

Rm,Rs,Rn 操作寄存器,不能是R15,Rd不能和Rm相同

MUL  将Rm和Rs相乘,并将最低有效32位结果放在Rd中

MLA  将Rm和Rs相乘,再加上Rn的值,将最低有效32位结果放在Rd中

4.8)UMULL、UMLAL、SMULL和SMLAL无符号和带符号长整数乘法和乘加,结果是64位

1

op {cond}{S} RdLo,RdHi,Rm,Rs

其中:

RdLo和RdHi 是结果寄存器

Rm和Rs 是操作数寄存器

UMULL将Rm和Rs中的值解释为无符号整数。

将两数相乘,并将结果的最低32位放RdLo中,高32位放RdHi中

UMLAL将Rm和Rs中的值解释为无符号整数。

将两数相乘,并将结果加回到RdLo和RdHi的64位无符号整数上。

SMULL将Rm和Rs中的值解释为有符号补码整数。

将两数相乘,并将结果的最低32位放RdLo中,高32位放RdHi中

SMLAL将Rm和Rs中的值解释为有符号补码整数。

并将结果加回到RdLo和RdHi的64位无符号整数上。

 

5)ARM转移指令

5.1)B和BL跳转指令

1

B {cond} label

2

BL {cond} label

其中:

label 是程序相对偏移表达式。

两条指令都会令程序转移到label上,而BL还会将原来的下一条指令地址保存在R14上

 

6)ARM协处理指令

 

7)其他指令

7.1)SWI软件中断

7.2)MRS  将CPSR或SPSR的内容保存到寄存器中

1

MRS {cond} Rd,psr

其中:

Rd目标寄存器,Rd不允许为R15

psrCPSR或SPSR

7.3)MSR  将立即数或通用寄存器的内容加载到CPSR或SPSR的指定区域

1

MSR {cond} _,#immed_8r

2

MSR {cond} _,Rm

其中:

psr 即是CPSR或SPSR

fileds是制定传送区域,可以是

     c  控制域屏蔽字节(PSR[7:

0])

     x  扩展域屏蔽字节(PSR[15:

8])

     s  状态域屏蔽字节(PSR[23:

16])

     f   标志域屏蔽字节(PSR[31:

24])

 

8)伪指令

8.1)ADR将程序的相对偏移或寄存器相对偏移地址加载到寄存器中

1

ADR {cond} register,expr

其中:

register 是加载的寄存器

expr  是程序相对偏移或寄存器相对偏移表达式,取值可以是

         非字节对齐地址-255~255

        字节对齐地址-1020~1020

请注意,这条指令是用来获取相对偏移地址的。

即是用当前PC的值,去减去某一个适当的值(编译器自动计算),从而得到expr这个标号的相对地址,将这个标号的相对于当前pc的偏移地址存储到register中。

正是因为这样,这条指令才是一条伪指令,这样的好处是可以绕过程序入口地址的影响,而始终能跳转到准确的地址,因为B这样的跳转指令是跳转到绝对地址上的,而ADR可以获取到一个相对于当前PC的地址,所以用处非常大。

8.2)LDR用常量或地址加载寄存器

1

LDR {cond} register,=[expr | label-expr]

其中:

register  加载寄存器

expr  赋值成数字常量

label-expr  程序相对偏移或外部表达式

汇编器可自动识别数字常量,从而完成对register赋值的操作。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2