免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 14055 | 回复: 12
打印 上一主题 下一主题

[BootLoader] mov指令的操作数的取值范围到底是多少 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-18 00:18 |只看该作者 |倒序浏览
本帖最后由 crifan 于 2011-05-14 00:38 编辑

mov指令的操作数的取值范围到底是多少

关于mov指令操作数的取值范围,网上看到一些人说是0x00-0xFF,也有人说是其他的值的,但是经过一番求证,发现这些说法都不对。下面就是来详细解释,mov指令的操作数的取指范围,到底是多少。



在看了我说的,关于这行代码:

  1. 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
数据处理指令的指令格式


对于此格式,我们可以拿:

  1. arm-linux-objdump –d u-boot > dump_u-boot.txt
复制代码

中得到的汇编代码中关于:

  1. ldr     r0, =0x53000000
复制代码

所对应的,真正的汇编代码:

  1. 33d00068:  e3a00453   mov r0, #1392508928   ; 0x53000000
复制代码

来分析,就容易看懂了:

  1. mov r0, #1392508928
  2. = mov  r0, #0x53000000
复制代码

的作用就是,把0x53000000移动到r0中去。

其对应的二进制指令是上面的:

  1. 0xe3a00453 = 1110 0011 1010 0000 0000 0100 0101 0011 b
复制代码

下面对照mov指令的格式,来分析这些位所对应的含义:


图表 32 mov指令0xe3a00453的位域含义解析

31-2827-262524-212019-1615-1211-0
Condition Field00I(Immediate Operand)OpCode(Operation Code)S(Set Condition Code)Rn(1st Operand Register)Rd(Destination Register)Operand 2(1 = operand 2 is an immediate value)
11-8Rotate7-0Imm
1110001110100000000001000101 0011
表明是立即数1101对应的是MOV指令MOV指令做的事情是: Rd:= Op2,Rn无关,所以忽略这个Rn表示0000号寄存器,即r00100=4,含义参见注释10x53

注释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-0xFF0-255),也不是只有2的倍数,而是:

只要该数,可以通过0x00-0xFF中某个数,循环右移偶数位而产生,就是合法的mov的操作数,否则就是非法的mov的操作数。

评分

参与人数 1可用积分 +8 收起 理由
bitmilong + 8 精品文章

查看全部评分

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
2 [报告]
发表于 2011-04-18 08:40 |只看该作者
只要该数,可以通过0x00-0xFF中某个数,循环右移偶数位而产生,就是合法的mov的操作数,否则就是非法的mov的操作数。

對的  書上看過

论坛徽章:
31
CU大牛徽章
日期:2013-03-13 15:15:08CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-09-18 15:16:55CU大牛徽章
日期:2013-09-18 15:18:22CU大牛徽章
日期:2013-09-18 15:18:43CU十二周年纪念徽章
日期:2013-10-24 15:41:34丑牛
日期:2013-12-01 10:11:07水瓶座
日期:2014-01-15 08:47:25
3 [报告]
发表于 2011-04-19 12:07 |只看该作者
而0x53循环右移8位,就得到了0x53000000,


麻烦解释下,我怎么看都是左移?

难道其他地方有说明?

论坛徽章:
0
4 [报告]
发表于 2011-04-19 13:48 |只看该作者
麻烦解释下,我怎么看都是左移?

难道其他地方有说明?
ddd010 发表于 2011-04-19 12:07



    先转成二进制 --> “循环右移”

论坛徽章:
31
CU大牛徽章
日期:2013-03-13 15:15:08CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-09-18 15:16:55CU大牛徽章
日期:2013-09-18 15:18:22CU大牛徽章
日期:2013-09-18 15:18:43CU十二周年纪念徽章
日期:2013-10-24 15:41:34丑牛
日期:2013-12-01 10:11:07水瓶座
日期:2014-01-15 08:47:25
5 [报告]
发表于 2011-04-19 13:57 |只看该作者
  1. 所谓循环右移就是把低位移出去的部分补到高位去。
复制代码
基础知识不牢靠,感谢bitmilong版主。

新人,以后还得请多关照。

论坛徽章:
0
6 [报告]
发表于 2011-04-19 18:57 |只看该作者
上过这门课的都知道,考试肯定会考这种题。去年ARM考试前夕,N多人问我什么是合法常数。书上虽也有,自学可能懒得去咬这些东西。很久没碰ARM汇编了,我记得写程序时直接使用ldr伪指令,如果是合法常数,编译器帮你转为mov,非法的就转为一个ldr。合法常数这东西,99%的时候是不用操心的。

论坛徽章:
0
7 [报告]
发表于 2011-05-13 10:47 |只看该作者
学习中

论坛徽章:
0
8 [报告]
发表于 2011-05-13 17:23 |只看该作者
如果连取值范围都不清楚,那么还应该回去学学基础……

论坛徽章:
0
9 [报告]
发表于 2011-05-13 20:17 |只看该作者
回复 3# ddd010


    明明是循环右移得到的嘛

论坛徽章:
0
10 [报告]
发表于 2011-05-14 00:31 |只看该作者
无数例子都说明,最好的资料,还是官方的资料,说的清楚和透彻。只是看资料,是要花一定精力和有一定的基础,才好看懂的。中国的资料,到处都是抄的太多,而且有些抄错的,也没人理会,很容易误导人。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP