ARM指令集分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ARM指令集分析
株洲同为嵌入式培训中心作者:郭庆
版本2013.8.v0.1问题一:MOV指令中的立即数
1.1指令格式
指令的基本格式如下:
其中<>号内的项是必须的,{}号内的项是可选的。各项的说明如下
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