免费注册 查看新帖 |

Chinaunix

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

[BootLoader] 关于为何不直接用mov指令,而非要用adr伪指令 [复制链接]

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

关于为何不直接用mov指令,而非要用adr伪指令

在分析ubootstart.S中,看到一些指令,比如:

  1. adr r0, _start
复制代码

觉得好像可以直接用mov指令实现即可,为啥还要这么麻烦地,去用ldr去实现?


关于此处的代码,为何要用adr指令:

  1. adr r0, _start
复制代码

注:其被编译器编译后,会被翻译成:

  1. sub r0, pc, #172
复制代码

而不直接用mov指令直接将_start的值赋值给r0,类似于这样:


  1. mov r0, _start
复制代码

呢?

其原因主要是,

  1. sub r0, pc, #172
复制代码

这样的代码,所处理的值,都是相对于PC的偏移量来说的,这样的代码中,没有绝对的物理地址值,都是相对的值,利用产生位置无关代码。因为如果用mov指令:

  1. mov r0, _start
复制代码

那么就会被编译成这样的代码:

  1. mov r0, 0x33d00000
复制代码

如果用了上面这样的代码:

  1. mov r0, 0x33d00000
复制代码

那么,如果整个代码,即要执行的程序的指令,被移动到其他位置,那么

  1. mov r0, 0x33d00000
复制代码

这行指令,执行的功能,就是跳转到绝对的物理地址,而不是跳转到相对的_start的位置了,

就不能实现我们想要的功能了,这样包含了绝对物理地址的代码,也就不是位置无关的代码了。

于此相对,这行指令:

  1. sub r0, pc, #172
复制代码

即使程序被移动到其他位置,那么该行指令还是可以跳转到相对PC往前172字节的地方,也还是我们想要的_start的位置,这样包含的都是相对的偏移位置的代码,就叫做位置无关代码。其优点就是不用担心你的代码被移动,即使程序的基地址变了,所有的代码的相对位置还是固定的,程序还是可以正常运行的。


关于,之所以不用上面的:

  1. mov r0, 0x33d00000
复制代码

类似的代码,除了上面说的,不是位置无关的代码之外,其还有个潜在的问题,那就是,关于mov指令的源操作数,此处即为0x33d00000,不一定是合法的mov 指令所允许的值,这也正是下面要详细解释的内容“mov指令的操作数的取值范围到底是多少”。


【总结】

之所以用adr而不用mov,主要是为了生成地址无关代码,以及由于不方便判断一个数,是否是有效的mov的操作数

评分

参与人数 1可用积分 +6 收起 理由
bitmilong + 6 鼓励一下

查看全部评分

论坛徽章:
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:39 |只看该作者
主要是因為mov不能傳入任何立即數吧

论坛徽章:
0
3 [报告]
发表于 2011-04-18 10:09 |只看该作者
主要是因為mov不能傳入任何立即數吧
amarant 发表于 2011-04-18 08:39


mov指令可以传入立即数的。

    MOV <opcode>{cond}{S} Rd,<Op2>
其中:
<Op2>is Rm{,<shift>} or,<#expression>
{cond}two-character condition mnemonic
{S}set condition codes if S present (implied for CMP, CMN, TEQ,
TST).
Rd, Rn and Rmare expressions evaluating to a register number.
<#expression>if used, the assembler will attempt to generate a shifted
immediate 8-bit field to match the expression. If this is
impossible, it will give an error.
<shift>is <shiftname> <register> or <shiftname> #expression,
or RRX (rotate right one bit with extend).
<shiftname>is: ASL, LSL, LSR, ASR, ROR.
(ASL is a synonym for LSL; they assemble to the same code.)


即Op2可以是一个寄存器(或被移位Shift的寄存器),或一个表达式。

而其中的表达式,就可以是一个立即数(即可以经过某个0xx-0xFF之间的某个数经过偶数次循环右移而得到的数)。

举例:
uboot生成的汇编中的mov指令:
33d00068: e3a00453  mov r0, #1392508928 ; 0x53000000
33d0006c: e3a01000  mov r1, #0 ; 0x0

论坛徽章:
0
4 [报告]
发表于 2011-04-18 11:02 |只看该作者
回复 2# amarant


    lz解释的很全面,除了因为mov 立即数的原因,另一重要的原因是因为最开始的代码必须是pic的。因为这部分代码经常被各种处理器放在不同的位置。一般由IROM地址跳至RAM地址。

论坛徽章:
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
5 [报告]
发表于 2011-04-18 11:56 |只看该作者
回复 4# linyunxian


    呵呵,以前没理解到这一层,受教了。

论坛徽章:
0
6 [报告]
发表于 2011-06-27 09:36 |只看该作者
我是初学者,受教了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP