(转)mov指令的操作数的取值范围到底是多少
2013-04-10 14:08
423 查看
mov指令的操作数的取值范围到底是多少
关于mov指令操作数的取值范围,网上看到一些人说是0x00-0xFF,也有人说是其他的值的,但是经过一番求证,发现这些说法都不对。下面就是来详细解释,mov指令的操作数的取指范围,到底是多少。
在看了我说的,关于这行代码:
mov r0, 0x33d00000
复制代码
的源操作数0x33d0000,可能是mov指令所不允许的,这句话后,可能有人会说,我知道,那是因为mov的操作数的值,不允许大于255,至少网上很多人的资料介绍中,都是这么说的。
对此,要说的是,你的回答是错误的。
关于mov操作数的真正的允许的取值范围,还真的不是那么容易就能搞懂的,下面就来详细解释解释。
总的来说,我是从这个帖子:
http://blog.chinaunix.net/space.php?uid=20799298&do=blog&cuid=2055392
里面,才算清楚mov的取值范围,以及找了相应的datasheet,才最终看懂整个事情的来龙去脉的。
首先,mov的指令,是属于ARM指令集中,数据处理(Data Process)分类中的其中一个指令,而数据处理指令的具体格式是:
ARM Processor Instruction Set
http://netwinder.osuosl.org/pub/netwinder/docs/arm/ARM7500FEvB_3.pdf
图表 31
数据处理指令的指令格式
对于此格式,我们可以拿:
arm-linux-objdump –d u-boot > dump_u-boot.txt
复制代码
中得到的汇编代码中关于:
ldr r0, =0x53000000
复制代码
所对应的,真正的汇编代码:
33d00068: e3a00453 mov r0, #1392508928 ; 0x53000000
复制代码
来分析,就容易看懂了:
mov r0, #1392508928
= mov r0, #0x53000000
复制代码
的作用就是,把0x53000000移动到r0中去。
其对应的二进制指令是上面的:
0xe3a00453 = 1110 0011 1010 0000 0000 0100 0101 0011 b
复制代码
下面对照mov指令的格式,来分析这些位所对应的含义:
图表 32 mov指令0xe3a00453的位域含义解析
注释1:
上述datasheet中写到:
“5.4.3 Immediate operand rotates
The immediate operand rotate field is a 4 bit unsigned integer which specifies a shift operation on the 8 bit immediate value. This value is zero extended to 32 bits, and then subject to a rotate right by twice the value in the rotate field. This enables many common constants to be generated, for example all powers of 2.”
意思是,对于bit[11:8]的值,是个4位,无符号的整型,其指定了bit[7:0]的8bit立即数值的位移操作。具体如何指定呢,那就是将bit[7:0]的值,循环右移2x bit[11:8]位。
对于我们的例子,就是,将bit[7:0]的值0x53,循环右移 2xbit[11:8]= 2 x 4 = 8位,
而0x53循环右移8位,就得到了0x53000000,就是我们要mov值,mov到目的寄存器rd,此处为r0中。
而上面英文最后一句说的是,通过将bit[7:0]的值,循环右移 2xbit[11:8]的方式,就可以产生出很多个数值了,即mov的操作数中,其中符合可以通过0x00-0xFF循环右移偶数位而产生的数值,都是合法的mov的操作数,而这样的数,其实是很多的。
【总结】
所以,mov指令的操作数的真正的取指范围,即不是0-0xFF(0-255),也不是只有2的倍数,而是:
只要该数,可以通过0x00-0xFF中某个数,循环右移偶数位而产生,就是合法的mov的操作数,否则就是非法的mov的操作数。
原文出处:http://bbs.chinaunix.net/thread-2304253-1-1.html
关于mov指令操作数的取值范围,网上看到一些人说是0x00-0xFF,也有人说是其他的值的,但是经过一番求证,发现这些说法都不对。下面就是来详细解释,mov指令的操作数的取指范围,到底是多少。
在看了我说的,关于这行代码:
mov r0, 0x33d00000
复制代码
的源操作数0x33d0000,可能是mov指令所不允许的,这句话后,可能有人会说,我知道,那是因为mov的操作数的值,不允许大于255,至少网上很多人的资料介绍中,都是这么说的。
对此,要说的是,你的回答是错误的。
关于mov操作数的真正的允许的取值范围,还真的不是那么容易就能搞懂的,下面就来详细解释解释。
总的来说,我是从这个帖子:
http://blog.chinaunix.net/space.php?uid=20799298&do=blog&cuid=2055392
里面,才算清楚mov的取值范围,以及找了相应的datasheet,才最终看懂整个事情的来龙去脉的。
首先,mov的指令,是属于ARM指令集中,数据处理(Data Process)分类中的其中一个指令,而数据处理指令的具体格式是:
ARM Processor Instruction Set
http://netwinder.osuosl.org/pub/netwinder/docs/arm/ARM7500FEvB_3.pdf
图表 31
数据处理指令的指令格式
对于此格式,我们可以拿:
arm-linux-objdump –d u-boot > dump_u-boot.txt
复制代码
中得到的汇编代码中关于:
ldr r0, =0x53000000
复制代码
所对应的,真正的汇编代码:
33d00068: e3a00453 mov r0, #1392508928 ; 0x53000000
复制代码
来分析,就容易看懂了:
mov r0, #1392508928
= mov r0, #0x53000000
复制代码
的作用就是,把0x53000000移动到r0中去。
其对应的二进制指令是上面的:
0xe3a00453 = 1110 0011 1010 0000 0000 0100 0101 0011 b
复制代码
下面对照mov指令的格式,来分析这些位所对应的含义:
图表 32 mov指令0xe3a00453的位域含义解析
31-28 | 27-26 | 25 | 24-21 | 20 | 19-16 | 15-12 | 11-0 | |
Condition Field | 00 | I(Immediate Operand) | OpCode(Operation Code) | S(Set Condition Code) | Rn(1st Operand Register) | Rd(Destination Register) | Operand 2(1 = operand 2 is animmediate value) | |
11-8Rotate | 7-0Imm | |||||||
1110 | 00 | 1 | 1101 | 0 | 0000 | 0000 | 0100 | 0101 0011 |
表明是立即数 | 1101对应的是MOV指令 | MOV指令做的事情是:Rd:= Op2,和Rn无关,所以忽略这个Rn | 表示0000号寄存器,即r0 | 0100=4,含义参见注释1 | 0x53 |
上述datasheet中写到:
“5.4.3 Immediate operand rotates
The immediate operand rotate field is a 4 bit unsigned integer which specifies a shift operation on the 8 bit immediate value. This value is zero extended to 32 bits, and then subject to a rotate right by twice the value in the rotate field. This enables many common constants to be generated, for example all powers of 2.”
意思是,对于bit[11:8]的值,是个4位,无符号的整型,其指定了bit[7:0]的8bit立即数值的位移操作。具体如何指定呢,那就是将bit[7:0]的值,循环右移2x bit[11:8]位。
对于我们的例子,就是,将bit[7:0]的值0x53,循环右移 2xbit[11:8]= 2 x 4 = 8位,
而0x53循环右移8位,就得到了0x53000000,就是我们要mov值,mov到目的寄存器rd,此处为r0中。
而上面英文最后一句说的是,通过将bit[7:0]的值,循环右移 2xbit[11:8]的方式,就可以产生出很多个数值了,即mov的操作数中,其中符合可以通过0x00-0xFF循环右移偶数位而产生的数值,都是合法的mov的操作数,而这样的数,其实是很多的。
【总结】
所以,mov指令的操作数的真正的取指范围,即不是0-0xFF(0-255),也不是只有2的倍数,而是:
只要该数,可以通过0x00-0xFF中某个数,循环右移偶数位而产生,就是合法的mov的操作数,否则就是非法的mov的操作数。
原文出处:http://bbs.chinaunix.net/thread-2304253-1-1.html
相关文章推荐
- mov指令的操作数的取值范围到底是多少
- mov指令的操作数的取值范围到底是多少
- Java中各数据类型占多少位以及取值范围
- java中的基本数据类型?各占多少位?多少字节?取值范围?
- HSV颜色空间中H分量的取值范围是多少
- java中int的取值范围是多少
- CUDA上add.f32指令的执行周期到底是多少?(续)
- java中的基本数据类型?各占多少位?多少字节?取值范围?
- java 数据类型有哪些取值范围多少
- CUDA上add.f32指令的执行周期到底是多少?
- 给定一个整数数组,其中元素的取值范围为0到10000,求其中出现次数最多的数
- ARM指令集中立即数寻址的范围
- 确定C语言各类型变量取值范围(不通过头文件)
- 常用数据类型取值范围
- 打印signed 及unsigned限定的char short int 及long类型变量的取值范围
- java中short、int、long、float、double取值范围
- ★人眼到底等于多少像素 ?
- 如果北京的房价下跌,到底能跌多少?
- 中国到底有多少个程序员?都在哪个城市写代码?
- 一个Android进程到底有多少个context对象呢