uboot2016.11分析4 - start.S 中的伪指令

【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) 

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个字节,重复1024
8次, 且将内存的值设为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

发布了68 篇原创文章 · 获赞 22 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/MACMACip/article/details/104898833