杜春雷 P145
在ARM汇编中,符号symbols可以表示:
1,地址
当符号表示地址的时候,又称之为标号。标号以数字开头的时候,他的作用范围是当前段,这种标号又叫做局部标号。
2,变量
3,数字常量。
数字常量使用EQU来定义,一旦定义,他的数值就不能再更改。
========================================================================================
变量有全局变量和局部变量。
GBLA GBLL GBLS 声明全局变量。
LCLA LCLL LCLS 声明局部变量。
在GNU 汇编中,使用.globl 来声明一个全局变量。
=========================================================================================
标号是表示程序中指令或者数据的地址的符号:第一,表示地址,第二,是个符号。
根据标号的生成方式,可以分为下面三种:
第一,基于PC的标号
基于PC的标号是位于目标指令前或者数据定义伪操作前的标号。这种标号在汇编的时候将被处理成PC值加上或者减去一个数字常量。
他常用语表示跳转指令的目标地址,或者代码段中嵌入的少量数据。
第二,基于寄存器的标号
基于寄存器的标号通常用MAP 和FILED伪操作定义,也可以用EQU伪操作定义。这种标号在汇编的时候将被处理成寄存器的值加上或者减去一个数字常量。他常用于访问数据段中的数据。
第三,绝对地址
绝对地址是一个32位的数字两。他可以寻址的范围是4G,也就是可以殉职整个内存空间。
==================================================================================================
局部标号主要用于在局部范围内使用。他由两部分组成:开头是一个0~99的数字,后面紧跟着一个通常表示该局部变量作用范围的符号。
局部变量的作用范围通常为当前段,也可以用伪操作ROUT来定义局部变量的作用范围。
===================================================================================================
Uboot中有一个不明白
先有 :
.globl _start 这表示 __start是一个变量。
后又有:
_start: b reset 这表示__start是一个标号
更倾向于认为,这是在给变量_start赋值。
===========================
那么看看给变量符号赋值,怎么做的
书上说是通过 SETA SETL SETS 为变量赋值的。这个后续再说
==================================================================================================
Symbols are a central concept: the programmer uses symbols to name things, the linker uses symbols to link, and the debugger uses symbols to debug.
Warning: as does not place symbols in the object file in the same order they were declared. This may break some debuggers.=============================================================
A label is written as a symbol immediately followed by a colon `:'. The symbol then represents the current value of the active location counter, and is, for example, a suitable instruction operand. You are warned if you use the same symbol to represent two different locations: the first definition overrides any other definitions.
===================================================
A symbol can be given an arbitrary value by writing a symbol, followed by an equals sign `=', followed by an expression (see ). This is equivalent to using the .set directive(也就是说等号这个赋值等价于.set指令). See . In the same way, using a double equals sign `='`=' here represents an equivalent of the .eqv directive. See .
===============================================================
==================================================================================================
标号就是一个指针变量!!生成一个标号(既然是标号,他的值就是一段数据或者代码的地址了),即牵涉到两个部分:
标号本身占据的空间
以及标号内容(也就是地址)那个位置的空间。

这里是UBOOT的u-boot-1.1.6/cpu/arm920tstart.S中的一个例子
分析:
代码段的起始地址0xA0000000。 定义了一个标号undefined_instruction。
这个标号放在0xA1110000这个地方。标号内容0xA0000000
==================================================
用关键字.word申请了一段空间,起始地址在0xB0000000。
定义了一个标号。_undefined_instruction
这个标号放在0xB0001111处,内容是0xB000000
=================================================
.word这个空间申请的时候,进行来初始化,使用变量undefined_instruction的值。
0xA0000000
=======================================================================================================
======================================================================================================
用C语言来类比:

char *undefined_instruction = 0xA0000000;
指针变量undefined_instruction本身存放在0xA1110000
=============================================
char *_undefined_instruction = undefined_instruction.
变量 _undeined_instruction本身放在0xB0001111
这个变量指向的内容放在0xB0000000
指向的内容被初始化为变量undefined_instruction的值。
===============================================================================================================
标号到底最终占不占空间?????
标号本身占据的空间
以及标号内容(也就是地址)那个位置的空间。

这里是UBOOT的u-boot-1.1.6/cpu/arm920tstart.S中的一个例子
点击(此处)折叠或打开
-
_undefined_instruction: .word undefined_instruction
-
- ........
-
-
/*
-
* exception handlers
-
*/
-
.align 5
-
undefined_instruction:
-
get_bad_stack
-
bad_save_user_regs
- bl do_undefined_instruction
分析:
代码段的起始地址0xA0000000。 定义了一个标号undefined_instruction。
这个标号放在0xA1110000这个地方。标号内容0xA0000000
==================================================
用关键字.word申请了一段空间,起始地址在0xB0000000。
定义了一个标号。_undefined_instruction
这个标号放在0xB0001111处,内容是0xB000000
=================================================
.word这个空间申请的时候,进行来初始化,使用变量undefined_instruction的值。
0xA0000000
=======================================================================================================
======================================================================================================
用C语言来类比:

char *undefined_instruction = 0xA0000000;
指针变量undefined_instruction本身存放在0xA1110000
=============================================
char *_undefined_instruction = undefined_instruction.
变量 _undeined_instruction本身放在0xB0001111
这个变量指向的内容放在0xB0000000
指向的内容被初始化为变量undefined_instruction的值。
===============================================================================================================
标号到底最终占不占空间?????