您好、欢迎来到现金彩票网!
当前位置:手机棋牌游戏下载 > 伪指令 >

arm 汇编中 word伪指令的用法

发布时间:2019-07-07 12:05 来源:未知 编辑:admin

  汇编和C引用变量的不同:汇编是“绝对”引用,即没有指针的概念,引用得到的就是值;c语言是“间接”引用,相当于指针的概念,引用地址变量,得到的就是该变量所指的内容值。

  按照上面的理解,_armboot_start与_bss_start都是没有实际意义的,它们只是一个地址,有实际意义的是地址中的内容_start和__bss_start(虽然也还是地址)。象第一句话,其“意图”很明显,是把gd作为全局数据结构体的指针,并初始化为“SDRAM中的uboot起始地址(即TEXT_BASE)-CFG_MALLOC_LEN-全局数据结构体大小”。

  第二句话也是一样的道理,它的意图是要计算u-boot映像的大小,应该写成__bss_start- _start才对阿?

  我使用readelf工具查看编译所得到的uboot映像文件得到信息如下:

  谢谢,eltshan!你的理解是正确的,不过我看了之后还是没能想得很明白,因为我在想,按你所说,那么_start的值应该是多少呢?难道是“breset”这条指令的机器码?所以我对ELF格式的u-boot映像文件作了反汇编,分析之后终于找到了症结所在。以下是部分分析过程,首先是反汇编:

  经过这个过程之后,我终于认识到自己的误解在哪里了。原来,我是把汇编语言中LDR伪指令对符号的引用与C语言中对汇编程序中符号/常量/变量的引用搞混淆了。我想说明以下几点:

  (1) readelf以及u-boot.map和System.map所给出的符号表中符号的值,实际上是表示符号所在的地址,而不是指符号本身的值。

  (3) C语言则不同,对变量/符号/常量的引用必须要通过地址来寻址,不管是全局变量还是局部变量,不同的是局部变量在生命期结束后,所占的地址空间会被释放而已。即使是函数调用时的参数传递,虽然是将实参的值拷贝给形参,但拷贝的过程也是通过实参和形参的地址来对两者进行访问的。

  现在,我们再回答最前面的问题:_start的值是什么?_start表示地址0xa1700000,在汇编语言中,对_start的绝对引用(这里是与用相对寻址进行跳转进行区别)就是将其替换为0xa1700000,但其中存放的内容的的确确就是b reset这条指令的机器码,所以如果在C语言中引用_start,得到的结果反而就是这个指令的机器码了。其实这个问题很简单,只是和C语言的引用搅在一起,一些概念被偷换了而已。

http://tennisinspokane.com/weizhiling/293.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有