第1阶段——关于u-boot目标文件start.o中.globl 和.balignl理解(3)

汇编程序中以.开头的名称并不是指令的助记符,不会被翻译成机器指令,而是给汇编器一些特殊指示,称为伪操作.

.globl _start  

作用:声明一个_start全局符号(Symbol), 这个_start这个符号要被lds链接脚本用到

.balignl 16,0xdeadbeef

作用:以当前地址开始,在地址为16的倍数的指令位置的上一个指令填入为0xdeadbeef的内容。

实例,在start.o中有以下几段:

1 .globl _start                             // .globl定义一个全局符号"_start",表明_start这个符号要被链接器用到 
2 _start:	                                  //_start:系统复位设置,以下共8种不同的异常处理
3 b reset                                   //复位异常             0x0
4 ldr	pc, _undefined_instruction          //未定义的指令异常       0x4
5 ldr	pc, _software_interrupt             // 软件中断异常          0x8 
6 ldr	pc, _prefetch_abort                 //内存操作异常           0xc
7 ldr	pc, _data_abort                     //数据异常               0x10
8 ldr	pc, _not_used                       //未使用                 0x14
9 ldr	pc, _irq                            //中断IRQ异常            0x18
10 ldr	pc, _fiq                          //快速中断FIQ异常        0x1c
11 
12 _undefined_instruction:	.word undefined_instruction         //0x20
13 _software_interrupt:	.word software_interrupt               //0x24
14 _prefetch_abort:	.word prefetch_abort                  // 0x28
15 _data_abort:	.word data_abort                          //0x2c
16 _not_used:	.word not_used                              //0x30
17 _irq:	.word irq                                       //0x34
18 _fiq:	.word fiq                                       //0x38
19 
20 .balignl 16,0xdeadbeef                                  //0x3c 

在第1行中".globl _start":

使用.globol声明全局符号_start,在 board/100ask24x0/u-boot.lds中ENTRY(_start)这里用到_start是一个符号,符号在汇编程序中代表一个地址,然后在lds链接脚本中通过这个_start全局符号来跳转到_start所在的地址来进行复位异常处理。

第20行中 .balignl 16,0xdeadbeef:

它的意思就是在以当前地址开始,在地址为16的倍数的指令位置的上一个指令填入为0xdeadbeef的内容,

此时当前地址刚好0x3c=60,由于ARM每个指令间隔4个字节,且64%16=0,所以在0x3c中填入0xdeadbeef。仿真如下图所示,可以看出在0X3C处填入了0xdeadbeef. 它们的作用就是为内存做标记,插在那里,这个位置往前有特殊作用的内存,禁止访问。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏开发与安全

shell programming tutorial

可以直接 man bash 学习语法和相关命令。 一、什么是shell程序 以文件形式存放批量的Linux命令集合,该文件能够被Shell解释执行,这种文件就是...

1769
来自专栏ROBOTEDU

控制程序运行指令

控制程序运行指令 一 子程序 1. 概述 在零件程序分为“主程序”和“子程序”时,就出现了“子程序”的概念。子程序指由主程序调用的零件程序。在目前的SINUME...

2724
来自专栏老秦求学

汇编语言学习之汇编语言源程序的输入

  在dos下输入汇编源程序的方法   一 环境的搭建   windows下运行“windows+r”键入“cmd”,就就进入dos系统,输入“debug”进入...

3185
来自专栏java闲聊

Shell入门

a. 单引号(括起来的字符都作为普通字符出现。特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释)

1124
来自专栏yw的数据分析

linux 的一些脑洞操作

把当前文件夹的文件名用","连接成一行,或者将多行转变为一行 ls | paste -s -d "," # -s 选项将输入进行一次性粘贴 ls | xarg...

3395
来自专栏zlmai的专栏

C++中关于几种输入方法的总结

C++中有很多关于输入的函数,比如cin、cin.get()、cin.getline()、getline()、gets()等等,很容易搞混,下面分别总结下,欢迎...

2125
来自专栏PHP技术

php日常使用总结

Private(私有): 只能在这个当前类的内部读取、修改。 Protected(受保护):能够在这个类和类的子类中读取和修改。 在方法内部通过 $this...

3468
来自专栏软件测试经验与教训

上期答案

3215
来自专栏静默虚空的博客

Shell 快速指南

Shell 快速指南 ███████╗██╗ ██╗███████╗██╗ ██╗ ██╔═══...

25510
来自专栏cs

python数据类型

python编译图 运行python文件的时候,python会通过编译器将它编译成.pyc文件。 如果没有修改python文件,每次执行程序时,就执行前面运行...

2845

扫码关注云+社区