ARM汇编中关于\\".word\\"伪指令的概念
更新时间:2023-11-09 16:59:01 阅读量: 教育文库 文档下载
PS:在u-boot源码时遇到_armboot_start、_bss_start等这些变量,不知道指向什么地址,
于是查了一下,弄清了ARM汇编中“.word”这个伪指令是什么意思了,感觉自己很菜。借鉴一下网友帖子的内容,关键在帖子最后的总结:
汇编和C引用变量的不同:汇编是“绝对”引用,即没有指针的概念,引用得到的就是值;c语言是“间接”引用,相当于指针的概念,引用地址变量,得到的就是该变量所指的内容值。 感谢原作者,以下为原帖:
aaronwong: u-boot中代码的疑问(_armboot_start与_start)? ---------------------------
我使用的是u-boot-1.3.0-rc2。在cpu/pxa/start.S中,有如下的标号定义: _TEXT_BASE:
.word TEXT_BASE /*uboot映像在SDRAM中的重定位地址,我设置为0xa170 0000 */
.globl _armboot_start _armboot_start:
.word _start /*_start是程序入口,链接完毕它的值应该是0xa170 0000=TEXT_BASE*/ /* 这句话的意思应该是在_armboot_start标号处,保存了_start的值,也就是说,_armboot_start是存放_start的地址,该地址对应的存储单元内容是0xa170 0000*/ /*
* These are defined in the board-specific linker script. 下面的定义与上面应该是一个意思。 */
.globl _bss_start _bss_start: .word __bss_start
======================
按照上面的理解,__bss_start是uboot 的bss段起始地址,那么uboot映像的大小就是__bss_start - _start;在relocate代码段中计算uboot的大小时,也体现了这一点。
实际上,_armboot_start并没有实际意义,它只是在\中用來寻址_start的值而已,_bss_start也是一样的道理,真正有意义的应该是_start和 __bss_start本身。 但是,令我不解的是,在C入口函数start_armboot()中(对应文件为lib_arm/board.c),有如下代码:
void start_armboot (void) { .........
gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t)); //第一句话 ..........
monitor_flash_len = _bss_start - _armboot_start; //第二句话 ...............
mem_malloc_init (_armboot_start - CFG_MALLOC_LEN); //第三句话 .......... }
==============================================
按照上面的理解,_armboot_start与_bss_start都是没有实际意义的,它们只是一个地址,有实
际意义的是地址中的内容_start和 __bss_start(虽然也还是地址)。象第一句话,其“意图”很明显,是把gd作为全局数据结构体的指针,并初始化为“SDRAM中的uboot起始地址(即TEXT_BASE)-CFG_MALLOC_LEN-全局数据结构体大小”。
要实现这个“意图”,应该是写成:gd = (gd_t*)(_start - CFG_MALLOC_LEN - sizeof(gd_t));或者gd = (gd_t*)(TEXT_BASE- CFG_MALLOC_LEN - sizeof(gd_t));才对阿?用_armboot_start来作运算应该是没有任何意义才对!?
第二句话也是一样的道理,它的意图是要计算u-boot映像的大小,应该写成__bss_start - _start才对阿?
我使用readelf工具查看编译所得到的uboot映像文件得到信息如下: [aaronwong@localhost build]$ readelf -s u-boot|grep _start 1018: a1700048 0 NOTYPE GLOBAL DEFAULT 1 _bss_start 1083: a1700044 0 NOTYPE GLOBAL DEFAULT 1 _armboot_start 1142: a1700000 0 NOTYPE GLOBAL DEFAULT 1 _start
1197: a171b070 0 NOTYPE GLOBAL DEFAULT ABS __bss_start 上面我删除了与该讨论无关的包含“_start\的标号信息。
显然,我前面的理解应该是正确的(_start=TEXT_BASE=0xa170 0000)。那么u-boot源代码中的monitor_flash_len=_bss_start - _armboot_start=0xa1700048 - 0xa1700044 = 4,有什么意义??
迷茫中,期盼大虾指点迷津,谢谢~!!!
eltshan: [Re: aaronwong] -----------------
1018: a1700048 0 NOTYPE GLOBAL DEFAULT 1 _bss_start 1083: a1700044 0 NOTYPE GLOBAL DEFAULT 1 _armboot_start 1142: a1700000 0 NOTYPE GLOBAL DEFAULT 1 _start
1197: a171b070 0 NOTYPE GLOBAL DEFAULT ABS __bss_start 我想:
_start所在的地址是a1700000,
_armboot_start 所在的地址是a1700044, 那么 根据这句:
_armboot_start: .word _start
所以_armboot_start的值应该是a1700000 所以
monitor_flash_len = _bss_start - _armboot_start = a171b070 - a1700000 = 1b070 而不是你说的 = 4
以上个人意见.
aaronwong: [Re: eltshan] -------------------
谢谢,eltshan!你的理解是正确的,不过我看了之后还是没能想得很明白,因为我在想,按你所说,那么_start的值应该是多少呢?难道是“b reset”这条指令的机器码?所以我对ELF格式的u-boot映像文件作了反汇编,分析之后终于找到了症结所在。以下是部分分析过程,首先是反汇编: arm-iwmmxt-linux-gnueabi-objectdump -D u-boot > u-boot.s
并提取了monitor_flash_len = _bss_start - _armboot_start;这条语句相关的反汇编代码如下: ============================== a1700044 <_armboot_start>:
a1700044: a1700000 .word 0xa1700000
a1700048 <_bss_start>:
a1700048: a171b070 .word 0xa171b070
a171b070
a171b070: 00000000 .word 0x00000000 .....
a1700f40: e59f41d0 ldr r4, [pc, #464] ; a1701118
a1700f7c: e59f3198 ldr r3, [pc, #408] ; a170111c
a1700f84: e59f4194 ldr r4, [pc, #404] ; a1701120
//r3= r3-r2 = a171b070-a1700000 = 1b070;
a1700f90: e59f218c ldr r2, [pc, #396] ; a1701124
a1701118: a1700044 .word 0xa1700044 a170111c: a1700048 .word 0xa1700048 a1701120: a1719d24 .word 0xa1719d24 a1701124: a171b070 .word 0xa171b070
======================================== 上面//是我自己的注释。这表明,你的理解的确是正确的。
经过这个过程之后,我终于认识到自己的误解在哪里了。原来,我是把\汇编语言中LDR伪指令对符号的
引用\与\语言中对汇编程序中符号/常量/变量的引用\搞混淆了。我想说明以下几点:
(1) readelf以及u-boot.map和System.map所给出的符号表中符号的值,实际上是表示符号所在的地址,而不是指符号本身的值。
(2) 汇编语言中没有指针的概念,因此对符号的引用是\赤裸裸\的。例如: ========== .globl _armboot_start _armboot_start: .word _start ldr r2, _armboot_start ========== 实际上反汇编以后是: ============
a1700044 <_armboot_start>:
a1700044: a1700000 .word 0xa1700000
a1700074: e51f2038 ldr r2, [pc, #-56] ; a1700044 <_armboot_start> ============
也就是说,_armboot_start是一个地址0xa1700044,其中的内容是0xa1700000,上面对
_armboot_start的引用是直接将其替换为其表示的地址0xa1700044,而非其中的内容0xa1700000。这就是\赤裸裸\的引用。
(3) C语言则不同,对变量/符号/常量的引用必须要通过地址来寻址,不管是全局变量还是局部变量,不同的是局部变量在生命期结束后,所占的地址空间会被释放而已。即使是函数调用时的参数传递,虽然是将实参的值\拷贝\给形参,但\拷贝\的过程也是通过实参和形参的地址来对两者进行访问的。 所以,在C语言中的 \这句话中对
_armboot_star的引用,实际上是把它用作了指针,把它作为访问对象的地址来使用,通过这个地址即a1700044 来访问对应存储空间所存放的内容亦即0xa1700000,_bss_start也是同样的道理。所以这句话实际上是monitor_flash_len =[a1700048]-[0xa1700044]=a171b070-a1700000 = 1b070,这样就得到了正确的结果。
现在,我们再回答最前面的问题:_start的值是什么?_start表示地址0xa1700000 ,在汇编语言中,对_start的\绝对引用\这里是与用相对寻址进行跳转进行区别)就是将其替换为0xa1700000,但其中存放的内容的的确确就是\这条指令的机器码,所以如果在C语言中引用_start,得到的结果反而就是这个指令的机器码了。其实这个问题很简单,只是和C语言的引用搅在一起,一些概念被偷换了而已。
正在阅读:
ARM汇编中关于\\".word\\"伪指令的概念11-09
各省军区独立师历史沿革04-25
试论我国财务分析指标体系06-04
A4纸输出A5纸小册子经验 - 图文10-21
五年级上册科学(未排版) - 图文04-29
学会这些沟通技巧有利于增进夫妻之间的感情03-13
中国科学院海洋所离退休职工管理办法04-29
国家标准图集及地方图集目录大全04-01
UPVC双壁波纹管价格(最新)08-31
主控楼施工方案01-11
- 1培根的\\"On studies\\"的原文及译文赏析
- 2谈国有林场&quot;十二五&quot;产业发展思路
- 3现代汉语中\\"V+的+N\\" 结构的歧义现象
- 4汉语的“给”和越南语的\\"cho\\"对比
- 5阅读课堂新常态:\\"1+X\\"
- 6利用空客飞机的\\"AIDS\\"系统排除飞机故障 - 图文
- 7《迷人的\\"where\\"》微课程设计方案 - 图文
- 8利用空客飞机的\\"AIDS\\"系统排除飞机故障 - 图文
- 9抗"疫"期间思想汇报5篇
- 10\\"市场营销学A\\"课程设计(论文)
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- quot
- 汇编
- 指令
- amp
- 概念
- 关于
- word
- ARM
- 小学一年级上书法教案
- 2018江苏省高考压轴冲刺卷(样卷)物理(word,含答案) - 图文
- 七年级下册英语第8单元知识点以及随堂练习
- 《财务报表分析》试题及标准答案(四)
- seo题库(答案注明)
- 大型光伏电站备案流程及要件
- 综合实践活动
- 电脑日常维修常识
- 最新2016-2017学年新人教版pep小学六年级英语上册教案收藏版教材教案 - 图文
- 冲孔灌注桩专项施工方案
- 高性能铁基软磁复合材料(SMC)在低碳经济中的应用 - 图文
- 最新渑池县直中学2015-2016上学期八年级语文第二次月考试题 苏教版 - 图文
- 4升5~1第一讲:行程问题之(中点相遇、往返相遇、环形相遇)
- 园林商业计划书
- 小学德育校本教材《礼仪素养篇》
- 青岛版小学数学二年级上册《角的初步认识》课堂实录
- 企业调研报告范文8篇
- 新概念入门级BUnit-6单元测试
- 《关于进一步支持设施农业健康发展的通知》国土资发〔2014〕127号
- 试验检测试题答案(自做)