ARM指令集分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ARM指令集分析

株洲同为嵌入式培训中心作者:郭庆

版本2013.8.v0.1问题一:MOV指令中的立即数

1.1指令格式

指令的基本格式如下:

{}{S},{,}

其中<>号内的项是必须的,{}号内的项是可选的。各项的说明如下

OPCODE:指令助记符;

COND:执行条件;

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

RD:目标寄存器;

RN:第1个操作数的寄存器;

OPERAND2:第2个操作数;

MOV指令语法如下所示:

MOV{COND}{S}RD,OP2

RD为目的操作数,OP2为源操作数。OP2可以是立即数,也可以是寄存器(有移位操作的或没有移位操作的),如果是立即数,那么立即数的范围是多少呢?如果是寄存器,那么寄存器如何移位呢?

MOV指令的编码格式

[31:28]条件码

[25]指明第二操作数(OPERAND2)是立即数还是寄存器;

[24:21]操作码,MOV指令的操作码为1101;

[19:16]第一操作数,第一操作数只能是寄存器,MOV指令中没用到,默认为0000;[15:12]目的寄存器;

[11:0]第二操作数,也就源操作数

条件码如下:

源操作数(OPERAND2)的分析

我们前面讲了源操作数有两种情况:立即数或寄存器。

1、源操作数为立即数

例1:

AREA reset,CODE,READONLY

ENTRY

CODE32

mov R0,#0x55

mov R0,#0x3FC

mov R0,#0x53000000

END

0x30000000E3A00055MOV R0,#0x00000055○1

0x30000004E3A00FFF MOV R0,#0x000003FC○2

0x30000008E3A00453MOV R0,#0x53000000○3

,10x0000005520x000003FC

的区别在哪里呢?

○1E3A00055展开后11100011101000000000000001010101 1110:条件码(always),无条件码

00:这两位固定为0

1:表示第二个操作数是立即数,

1101:MOV的操作码是1101

0:对CPSR中符号位是否有影响0:表示无影响1:表示有影响

0000:第一个操作寄存器不存在

0000:目标寄存器的编号,0000表示R0,0001表示R1

000001010101:第二操作数

第二操作数是一个特殊格式,当第二操作数是立即数是,它由一个无符号的8位立即数和一个循环移位值构成,第二操作数=立即数>>(循环移位值*2)。

第二操作数是000001010101,其中0000为循环右移值,01010101为立即数。

因此第二操作数=0x55>>(0*2)=0x55;

○2E3A00FFF展开后11100011101000000000111111111111 111111111111:第二操作数

第二操作数111111111111很明显已经超出了8位立即数的表示范围,那这个值怎么表示呢?

0x3FC:00000000000000000000001111111100

可由11111111循环右移30位得到,依照第二操作数的格式,因此第二操作数的值为111111111111,即FFF

○3E3A00453展开后11100011101000000000010001010011

010*********:第二操作数

0x53000000:01010011000000000000000000000000

可由01010011循环右移(4*2)位实现

结论:

1)当立即数小于255时,不需要进行循环右移操作,也就是Rotate为0000,当立即数大于255是需要进行右移操作,并且是右移Rotate*2。

2)因为可以通过循环右移实现更大的立即数,但是有些立即数是不能通过循环右移实

现的。

如:mov R0,#0x3FF

展开后00000000000000000000001111111111这个数不能通过右移实现

3)立即数寻址是直接寻址,立即数包含在指令码中。

2、第二操作数为寄存器移位寻址

例1:

AREA reset,CODE,READONLY

ENTRY

CODE32

mov R1,#0x5

mov R2,R1,LSL#3

END

反汇编指令

0x30000000E3A01005MOV R1,#0x00000005

0x30000004E1A02181MOV R2,R1,LSL#3○1

○1E1A02181展开后11000001101000000010000110000001 1110:条件码(always),无条件码

00:这两位固定为0

0:表示第二个操作数是寄存器

1101:MOV的操作码是1101

0:对CPSR中符号位是否有影响0:表示无影响1:表示有影响

0000:第一个操作寄存器不存在

0010:目标寄存器的编号,0010表示R2

000110000001:第二操作数

在使用移位寄存器寻址值,当移位值为立即数时,第二操作数的格式如下

结论:最后4位0001表示源寄存器为R1,bit5~6为00表示裸机左移,00011表示左移的数量为3

例:

AREA reset,CODE,READONLY

ENTRY

CODE32

MOV R0,#3

MOV R1,#0x5

MOV R2,R1,LSL R0

相关文档
最新文档