u-boot/cpu/xx/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 
===============================================
在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); //第三句话 
.......... 
}

在这里,如果混淆了在汇编中和C语言中对汇编标号的引用的区别,就会认为monitor_flash_len=_bss_start - _armboot_start=0xa1700048 - 0xa1700044 = 4
其实
monitor_flash_len = _bss_start - _armboot_start = a171b070 - a1700000 = 1b070

===============================================
下边总结一下,汇编语言和C语言中对汇编中的全局标号的引用的区别:

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

在汇编中,标号==地址,对标号的引用就是对标号对应的地址操作,如_armboot_start,其值就是a1700044,如果想取得其对应内存地址中的数据,就需要ldr等指令。举个不恰当的例子,如果在汇编语言中也可以有类似x-y的操作的话
monitor_flash_len=_bss_start - _armboot_start=0xa1700048 - 0xa1700044 = 4
这是完全正确的。

然而,在C语言中,其结果却不是这样的。在C中,对汇编中的全局标号的引用,其值不再是地址,而是地址对应内存单元中的数据,所以对于C语言
monitor_flash_len = _bss_start - _armboot_start = a171b070 - a1700000 = 1b070

在C语言中,对基本数据类型变量的引用,其值就是对应内存中的数据,而对于复杂数据类型及函数,其标识符名是指向首地址的指针,其值是它们的首地址。
或许可以这样理解,由于对于基本数据类型来说,其地址和对应内存单元中的数据刚好是一一对应的,对变量的引用目的也是希望对内存中的数据进行操作,所以默认是取得变量对应内存单元中的数据;而对于复杂数据类型及函数来说,利用一个地址取得全部数据是不可能的,所以就用标明首地址的方式,加上地址的线性连续,便可以通过首地址取得全部数据,这是通过对指针(地址)的操作来实现的。

--------------------- 本文来自 Decisiveness 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/Decisiveness/article/details/44153723?utm_source=copy

GUN ARM汇编中标号的引用在汇编和C语言中区别(monitor_flash_len = _bss_start - _armboot_start;)相关推荐

  1. c语言中不能编译,为什么`int;`可以在C语言中很好地编译,而在C ++中却不能?

    考虑以下程序(请参见此处的现场演示). #include int main(void) { int ;  // Missing variable name puts("Surprise&qu ...

  2. C++中 *(指针引用)与*(指针)的区别

    转自:http://blog.sina.com.cn/s/blog_673ef8130100imsp.html 指针传递参数本质上是值传递的方式,它所传递的是一个地址值.值传递过程中,被调函数的形式参 ...

  3. c语言编号程序,c语言中如何在一个程序语句前加编号c语言中如何在一个程序语句前加...

    多数情况下,现在的编程高手都是从学习C 语言入门的,在学校里,计算机相关专业中最基础的课程也包括C 语言,因此,掌握好这门课程对每一位立志成为优秀程序员的初学者来说是大有裨益的!另外,对想通过参加全国 ...

  4. c语言中什么情况下会出现随机数,C语言中如何产生随机数

    今天看到一段小程序 ,里面用到随机数.才发现在C语言中产生随机数不像matlab中那么简单. C中也有rand()函数,但是rand()函数产生的数不是真正意义上的随机数,是一个伪随机数,是根据一个数 ...

  5. (mfc)将字符串中的字符逐个按行输出_C语言中字符串输入输出

    在C语言中没有字符串类型,用字符数组处理字符串 定义 字符数组定义:char 数组名 [常量表达式][常量表达式] 一维字符数组,用于存储和处理一个字符串 . 二维字符数组,用于同时存储和处理多个字符 ...

  6. c语言中存储字符用什么函数,那些C语言中你不知道的字符串函数(坑)

    1.strcpy() 在字符串拷贝函数中,它的函数编写不难,如下 char* Strcpy(char* dest, const char* src) { assert(dest != NULL &am ...

  7. c语言中字符减减自符意思,C语言中的自加自减运算

    [摘 要]C语言中运算符十分丰富,自加运算和自减运算是c语言的教学中的重点和难点,但我们只要在教学中抓住运算的基本定义,通过经典题型分析和适度深入解析,就不难达到熟练应用之目的. [关键词]运算的定义 ...

  8. c语言中的关于数学问题的编程,C语言中具有代表性几种数学问题编程技巧探索.doc...

    C语言中具有代表性几种数学问题编程技巧探索 C语言中具有代表性几种数学问题编程技巧探索 [摘要]本文分析了C语言中几种常见的具有代表性的几类数学问题,从数学规律.语法结构分析.语句优化设计及应用方面, ...

  9. c语言中整形精确到后面几位,C语言中普通整型变数在记忆体中占几个位元组

    C语言中普通整型变数在记忆体中占几个位元组以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! C语言中普通整型变数在记忆体中 ...

最新文章

  1. 西游记里河水让人怀孕的秘密:是寄生虫!我往河里放了寄生虫!
  2. 最后一期:如何更新LSTM模型?(附代码)| 博士带你学LSTM
  3. Hadoop Streaming高级编程
  4. C# 总结const、 readonly、 static三者区别:
  5. 2019/12/11学习内容摘要(Linux系统用户与用户组管理①)
  6. Onew Ex凝聚共识,维护生态繁荣
  7. 上海消保委评饿了么“多等5分钟”功能:逻辑上有问题
  8. [CENTOS7] [IPTABLES] 卸载Firewall Id安装 IPTABLES及防火墙设置
  9. iOS UI08_TableView界面传值
  10. 圆柱体积计算机公式,圆柱的体积怎么算公式
  11. 苹果笔记本服务器虚拟系统,苹果Mac虚拟机装Windows哪家强?
  12. 三招让windows硬盘资料隐身
  13. 微信小程序:设置文本字体粗细font-weight
  14. css点击字变颜色_使用CSS颜色关键字
  15. 欢迎访问我的简书博客 http://www.jianshu.com/users/3b5c25e9ec5d/latest_articles
  16. 萝卜APP4.30 萝卜APP 追影兔4.30最新开源码
  17. 部分准备金银行已经过时
  18. blob开头的文件下载_Blob下载文件流
  19. 专业的图像处理软件-PhotoShop CS6提供下载
  20. 地产动画制作需求有哪些?

热门文章

  1. Qt官方文档阅读笔记-对官方Star Delegate Example实例的解析
  2. Linux学习笔记-Makefile中的变量及函数
  3. Struts2 访问上下问对象
  4. echarts 地图 dispatchaction不好使_数据分析帝:广东省客户数量地图展示,如何通过python实现?...
  5. clone git 修改保存路径_用git管理版本,你必须知道的事情
  6. 二叉树经典题之二叉树的非递归遍历
  7. Linux系统编程23:基础IO之了解硬盘物理和逻辑结构及明白inode的本质和掌握软硬链接及其区别
  8. 55 - I. 二叉树的深度
  9. Python list去重,去掉list中元素为字典的且字典部分key相同的list元素(列表去重、字典去重)
  10. ubuntu16.04下安装mysql详细步骤