第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 条评论
登录 后参与评论

相关文章

来自专栏Java面试笔试题

什么是ORM?

对象关系映射(Object-Relational Mapping,简称ORM)是一种为了解决程序的面向对象模型与数据库的关系模型互不匹配问题的技术;简单的说,O...

842
来自专栏calmound

ZOJ 2724 Windows Message Queue(优先队列)

优先队列的概念及使用方法 题意:输入GET,队列为空则输出空,否则输出最优先的数据(所谓最优先,就是优先值最小的一个),若输入PUT,输入三个数据,分别是名字,...

3615
来自专栏Java Edge

类加载器与双亲委派模型1 类加载器 2 双亲委派模型

类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因。 在类加载的第一阶段“加载”过程中,需要通过一个类的全限定名来获取...

1032
来自专栏散尽浮华

linux运维中的命令梳理(三)

----------文本操作命令---------- sed命令:文本编辑工具 sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可...

2218
来自专栏L宝宝聊IT

Linux基础——正则表达式

1103
来自专栏张首富-小白的成长历程

Linux-四剑客-find-awk-grep-sed解释----未完结版

find - search for files in a directory hierarchy 搜索目录层次结构中的文件 用来在指定目录下面查找文件或目录,任...

923
来自专栏QQ音乐技术团队的专栏

一种Android App在Native层动态加载so库的方案

这篇文章通过实战案例,介绍了一种有条理的组织Native层代码层级结构的方法。并且,在良好的代码层级、作用分工的基础上,实现了动态的按需加载、卸载so库。文章...

8846
来自专栏北京马哥教育

十分钟带你了解 Python3 多线程核心知识

每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 每个线程都有他自...

2535
来自专栏debugeeker的专栏

《coredump问题原理探究》windows版6.1节无成员变量的类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/detai...

473
来自专栏程序你好

Java虚拟机JVM架构解析

每个Java开发人员都知道字节码将由JRE (Java运行时环境)运行。但是许多人不知道JRE是Java虚拟机(JVM)的实现,它分析字节码、解释并执行代码。作...

622

扫码关注云+社区