【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
start.S 中的伪指令
汇编程序中以.开头的语句并不是指令的助记符,且不会被翻译成机器指令,而是给汇编器一些特殊指示,称为汇编指示(Assembler Directive) / 伪操作(Pseudo-operation)
.global [name]
声明一个全局符号(Symbol).globl _start
.globl指示告诉汇编器,_start这个符号要被链接器用到.
一般来说, _start就像C程序的main函数一样特殊,是整个程序的入口,链接器在链接时会查找目标文件中的_start符号代表的地址,把它设置为整个程序的入口地址,所以每个汇编程序都要提供一个_start符号并且用.globl声明。如果一个符号没有用.globl声明,就表示这个符号不会被链接器用到。
.balignl [align] [data]
写内存(一般用于标记).balignl 64,0xdeadbeef
从当前地址开始,在地址为64的倍数的指令位置的上一个指令处填入为0xdeadbeef的内容,
上面语句的作用是为内存做标记,插在那里,这个位置往前有特殊作用的内存,禁止访问。
.fill [repeat] [size] [value]
分配内存并赋值..fill 10248,1,0
创建1个字节,重复10248次, 且将内存的值设为0.
其中 size 和 value 是可选的,默认值分别为 1 和 0.
.word [expression]
在当前位置放一个word型的值,这个值就是expression_blank_zone_start:
.word 0x15550000
就是在当前地址,即_blank_zone_start处放一个值0x15550000
是骡是马, 拉出来遛一遛:
汇编代码使用的是uboot的start.S编译生成start.o, 然后对start.o进行反汇编得到反汇编部分代码. 局部讲解来验证我们上面说的对不对.
反汇编命令: objdump -D xxx.o
.globl 的示例
汇编代码:
.globl _start
_start:
链接文件: (u-boot.lds)
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x80700000;
可见在汇编中用.globl声明的全局符号, 在makefile的帮助下可以被链接文件使用到.
.balignl 的示例
汇编代码:
.globl _start
_start:
b reset
b .
b .
b .
b .
b .
b .
b .
.balignl 64,0xdeadbeef
反汇编代码:
00000000 <_start>:
0: eafffffe b 205c <reset>
4: eafffffe b 4 <_start+0x4>
8: eafffffe b 8 <_start+0x8>
c: eafffffe b c <_start+0xc>
10: eafffffe b 10 <_start+0x10>
14: eafffffe b 14 <_start+0x14>
18: eafffffe b 18 <_start+0x18>
1c: eafffffe b 1c <_start+0x1c>
20: deadbeef .word 0xdeadbeef
24: deadbeef .word 0xdeadbeef
28: deadbeef .word 0xdeadbeef
2c: deadbeef .word 0xdeadbeef
30: deadbeef .word 0xdeadbeef
34: deadbeef .word 0xdeadbeef
38: deadbeef .word 0xdeadbeef
3c: deadbeef .word 0xdeadbeef
可见, 有一段内存的内容被填充为deadbeef, 这正是.balignl 64,0xdeadbeef作用导致的.
.fill [repeat] [size] [value] 的示例
汇编代码:
__blank_zone_start:
.fill 1024*8,1,0
__blank_zone_end:
反汇编代码:
00000040 <__blank_zone_start>:
...
00002040 <_blank_zone_start>:
2040: 00000040 .word 0x00000040
00002044 <_blank_zone_end>:
上面没有很明确地表达出00000040~00002040地址地值被被置为空了, 但是可以看到命令如设想般地执行了.(十进制的1024*8 = 十六进制的0x2000).
word [expression]
汇编部分:
_blank_zone_start:
.word __blank_zone_start
.globl _blank_zone_end
_blank_zone_end:
反汇编部分:
00002040 <_blank_zone_start>:
2040: 00000040 .word 0x00000040
00002044 <_blank_zone_end>:
由前面的反汇编片段可知__blank_zone_start的地址为00000040, 所以.word __blank_zone_start