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. 交换安全老师课堂笔记
  3. java xmlrpc2.0 实现_简单的java xmlrpc
  4. mysql zip 还原_mysql 压缩还原数据库
  5. 合唱队形(信息学奥赛一本通-T1264)
  6. NPOI操作word文档
  7. linux rto 参数设置,linux 如何计算RTO值
  8. 《信号与系统》解读 第1章 信号与系统概述-6:系统对时域信号的基本运算与基本变换---幅度、加法、乘法、积分、微分、时延、反转、混合
  9. python3换行符_python的换行符
  10. HTTP ERROR 404 Problem accessing /hwi/authorize.jsp. Reason: HWI HIVE
  11. ntp服务器安装和配置文件,NTP服务的安装、配置和使用
  12. 猜数字游戏c语言提示范围,【游戏编程】猜数字游戏(C语言)
  13. 2021年Facebook广告投放的9条建议
  14. Python——信号量、条件变量、事件
  15. C++ OpenCV特征提取之KAZE检测
  16. 通过Kali Linux暴力破解WiFi密码
  17. SSM Chapter 07 MyBatis与Spring的整合
  18. 用计算机弹大白菜鸡毛菜,抖音大白菜、鸡毛菜是什么歌
  19. 东北大学计算机学硕复试分数线,东北大学2019年考研复试分数线已公布
  20. Matlab 求z变换函数的反变换函数 iztrans()函数

热门文章

  1. pandas用众数填充缺失值_【机器学习】scikit-learn中的数据预处理小结(归一化、缺失值填充、离散特征编码、连续值分箱)...
  2. linux 找不到swap分区,Linux下swap分区没有UUID解决办法
  3. python工厂模式 简书_工厂模式
  4. html实现websocket协议,HTML5实现WebSocket协议原理浅析
  5. clsq客户端android,Android NDK开发之 arm_neon.h文件ABI说明
  6. 计算机网络之数据链路层:10、CSMA协议-随机访问介质访问控制
  7. 3-5:常见任务和主要工具之归档和备份
  8. 面试题05. 替换空格
  9. AntiSpy:一款功能强大的反病毒反Rootkit免费工具套件
  10. python json串中文乱码问题