【ARM64 常见汇编指令学习 13 -- ARM 汇编 ORG 伪指令学习】

news2024/9/28 13:19:40

文章目录

    • ARM ORG 指令介绍
      • UEFI 中对 ORG 指令的使用

ARM ORG 指令介绍

在ARM汇编中,"org"是一个汇编器伪指令,用于设置下一条指令的装入地址。"org"后面跟着的是一个表达式,这个表达式的值就是下一条指令的装入地址。如果不用org规定则汇编得到的目标程序将从0x0000开始。两个org伪指令之间,除了指令代码,若有自由空间,则用0填充。

org 指令本身并不能决定程序将要加载到内存的什么位置,它只是告诉编译器,我的程序在编译好后需要加载到 xxx 地址,所以请你在链接时调整好数据访问时的地址,就是为程序中所有的引用地址增加一个段内偏移值

例如:

.org 0x1000 
  mov r0, #10

上述代码中,“.org 0x1000” 设置了下一条指令(“mov r0, #10”)的装入地址为0x1000。也就是说,当这个汇编文件被链接并加载到内存中时,"mov r0, #10"这条指令的地址将会是0x1000org 指令是链接时使用的,不是汇编那一步使用的。即不是cpu的一条指令,而是给编译器看的伪指令。

另外,“.org"通常只在裸机或者特殊的系统编程中使用,比如在写引导加载程序或者操作系统内核的时候。在普通的应用程序开发中,一般不需要使用”.org",因为链接器和加载器会自动处理指令的装入地址。

UEFI 中对 ORG 指令的使用

我们可以在文件 ArmPkg/Include/Chipset/AArch64.h 中看到 org 指令的使用:

#define VECTOR_ENTRY(tbl, off)    \
  .org off

#define VECTOR_END(tbl)           \
  .org 0x800;                     \
  .previous

从上面的实现可以看到 VECTOR_ENTRY 的作用是将其后面的内容放到 off 地址开始的地方,只需要关注其第2个参数。VECTRO_END的作用是将其后面的内容放到 0x800(2k)后。

我们知道 VECTRO_ENTRY 是在中断向量表中用到的宏,那我们先看下 ARMv8 UEFI 对于中断向量表是如何定义的呢?
见:edk2/ArmPkg/Library/ArmExceptionLib/AArch64/ExceptionSupport.S

ARMv8有4个异常级别,每一个异常级别对应一个 VBAR(Vector Base Address Register) 寄存器,用来指向异常向量表的基地址,每一个异常向量表的大小为128个字节,也即可以存放32条指令;同时每一个异常向量表会分为 4 组,每一组包含4 种异常

//
// Current EL with SP0 : 0x0 - 0x180
//
VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SP0_SYNC)
ASM_PFX(SynchronousExceptionSP0):
  ExceptionEntry  EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS

VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SP0_IRQ)
ASM_PFX(IrqSP0):
  ExceptionEntry  EXCEPT_AARCH64_IRQ

VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SP0_FIQ)
ASM_PFX(FiqSP0):
  ExceptionEntry  EXCEPT_AARCH64_FIQ

VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SP0_SERR)
ASM_PFX(SErrorSP0):
  ExceptionEntry  EXCEPT_AARCH64_SERROR

//
// Current EL with SPx: 0x200 - 0x380
//
VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SPX_SYNC)
ASM_PFX(SynchronousExceptionSPx):
  ExceptionEntry  EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS, SP0

VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SPX_IRQ)
ASM_PFX(IrqSPx):
  ExceptionEntry  EXCEPT_AARCH64_IRQ

VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SPX_FIQ)
ASM_PFX(FiqSPx):
  ExceptionEntry  EXCEPT_AARCH64_FIQ

VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SPX_SERR)
ASM_PFX(SErrorSPx):
  ExceptionEntry  EXCEPT_AARCH64_SERROR
//
// Lower EL using AArch64 : 0x400 - 0x580
//
VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A64_SYNC)
ASM_PFX(SynchronousExceptionA64):
  ExceptionEntry  EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS

VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A64_IRQ)
ASM_PFX(IrqA64):
  ExceptionEntry  EXCEPT_AARCH64_IRQ

VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A64_FIQ)
ASM_PFX(FiqA64):
  ExceptionEntry  EXCEPT_AARCH64_FIQ

VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A64_SERR)
ASM_PFX(SErrorA64):
  ExceptionEntry  EXCEPT_AARCH64_SERROR

//
// Lower EL using AArch32 : 0x600 - 0x780
//
VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A32_SYNC)
ASM_PFX(SynchronousExceptionA32):
  ExceptionEntry  EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS

VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A32_IRQ)
ASM_PFX(IrqA32):
  ExceptionEntry  EXCEPT_AARCH64_IRQ

VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A32_FIQ)
ASM_PFX(FiqA32):
  ExceptionEntry  EXCEPT_AARCH64_FIQ

VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A32_SERR)
ASM_PFX(SErrorA32):
  ExceptionEntry  EXCEPT_AARCH64_SERROR

VECTOR_END(ExceptionHandlersStart)

上表中 VECTOR_ENTRY 第二个参数即为异常类型,对应的宏定义如下:

// Vector table offset definitions
#define ARM_VECTOR_CUR_SP0_SYNC  0x000
#define ARM_VECTOR_CUR_SP0_IRQ   0x080
#define ARM_VECTOR_CUR_SP0_FIQ   0x100
#define ARM_VECTOR_CUR_SP0_SERR  0x180

#define ARM_VECTOR_CUR_SPX_SYNC  0x200
#define ARM_VECTOR_CUR_SPX_IRQ   0x280
#define ARM_VECTOR_CUR_SPX_FIQ   0x300
#define ARM_VECTOR_CUR_SPX_SERR  0x380

#define ARM_VECTOR_LOW_A64_SYNC  0x400
#define ARM_VECTOR_LOW_A64_IRQ   0x480
#define ARM_VECTOR_LOW_A64_FIQ   0x500
#define ARM_VECTOR_LOW_A64_SERR  0x580

#define ARM_VECTOR_LOW_A32_SYNC  0x600
#define ARM_VECTOR_LOW_A32_IRQ   0x680
#define ARM_VECTOR_LOW_A32_FIQ   0x700
#define ARM_VECTOR_LOW_A32_SERR  0x780

上面的宏定义正好和ARMv8 异常类型偏移对应一致:
在这里插入图片描述

上面只是配置中断类型的偏移底子,但是偏移地址是基于中断向量表的开始地址偏移的,那么中断向量表的开始地址在哪呢?
见:edk2/ArmPkg/Library/ArmExceptionLib/AArch64/ExceptionSupport.S

//
// There are two methods for installing AArch64 exception vectors:
//  1. Install a copy of the vectors to a location specified by a PCD
//  2. Write VBAR directly, requiring that vectors have proper alignment (2K)
// The conditional below adjusts the alignment requirement based on which
// exception vector initialization method is used.
//

#if defined(ARM_RELOCATE_VECTORS)
GCC_ASM_EXPORT(ExceptionHandlersStart)
ASM_PFX(ExceptionHandlersStart):
#else
VECTOR_BASE(ExceptionHandlersStart)
#endif

这里我们主要看下 VECTOR_BASE

#define VECTOR_BASE(tbl)          \
  .section .text.##tbl##,"ax";    \
  .align 11;                      \
  .org 0x0;                       \
  GCC_ASM_EXPORT(tbl);            \
  ASM_PFX(tbl):                   \

从上面可以看到 .org 0 也即中断向量表的地址在text 段 内偏移为 0 。那么实际的物理地址还需要看链接脚本是如何配置的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/837974.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于STM32设计的智能空调

一、项目背景 随着人们生活水平的不断提高,对居住环境的舒适度要求也越来越高。空调作为一种重要的家电设备,已经成为了现代家庭中必不可少的一部分。本文介绍了一种基于STM32的智能空调设计方案,可以自动地根据环境温度进行温度调节。 二、…

单价20块蓝牙耳机卖爆越南市场,现象级爆款出现?

以儒道为文化底蕴的越南,是与中国最为相近的东南亚国家,"快速增长的劳动人口相对年轻的社会群体"是很多人对越南这个国家的基本认知。背靠庞大的Z世代用户群体,越南社会年轻化消费需求暴涨,手机与数码品类商品作为“年轻…

OpenCL编程指南-9.1命令、队列、事件

概述 命令队列是OpenCL的核心。平台定义了一个上下文,其中包含一个或多个计算设备。每个计算设备可以有一个或多个命令队列。提交到这些队列的命令将完成OpenCL程序的具体工作。 在一个简单的OpenCL程序中,提交到一个命令队列的命令会按顺序执行。一个…

ThinkPHP5使用phpqrcode生成二维码

生成指定跳转地址二维码图片: 首先将下载好的phpqrcode.php文件放到指定目录内(我这里用的放在public/phpqrcode目录下),准备调用 之后控制器中调用 public function qrcode(){require_once "./phpqrcode/phpqrcode.php&quo…

浅谈能源管理系统在电子厂房中的应用

贾丽丽 安科瑞电气股份有限公司上海嘉定201801 摘要:以能耗管理系统在工业厂房的应用为例,介绍了系统架构及功能。重点分析能耗管理系统在工业厂房实施过程中遇到的难点,并对系统采集的数据进行分析,提出了相应的节能措施&#…

【百问百答】可靠性基础知识第七期

1.什么是振动频率范围? 振动频率范围表示振动试验由某个频率点到另一个频率点进行往复扫频。 例如:试验频率范围5~500Hz,表示5Hz到500Hz进行往复扫频 2.什么是振动量? 振动量:通常用加速度和位移来表示; 加速度:表…

轻松延长手机待机时长,2步设置让你告别电量焦虑

在现代社会中,手机成为了我们生活中不可或缺的伙伴。然而,随着手机功能的日益增多和使用频率的提高,电池续航时间成为了让许多人苦恼的问题。谁不曾遇到过电量不足的尴尬情况?当我们需要手机时,却发现它只剩下最后一丝…

2023年华数杯大学生数学建模【B题不透明制品最优配色方案设计】详细建模方案

目录 完整思路下载链接:这里获取2023华数杯全国大学生数学建模竞赛题目B 题不透明制品最优配色方案设计✅ 问题1问题1建模思路✅ 问题2问题2建模思路✅ 问题3问题3建模思路✅ 问题4问题4建模思路提供的数据和资料: 完整思路下载链接:这里获取…

高电压功率放大器原理是什么意思

高电压功率放大器是一种特殊类型的功率放大器,它可以将输入信号放大到高电压水平。这种设备通常用于测试和测量应用、电子学研究以及医疗成像等领域。它们的工作原理基于半导体器件(如晶体管或MOSFET)和放大器电路的组合使用,可以…

公司新来了个00后,一副毛头小子的样儿,哪想到是新一代卷王...

内卷,是现在热度非常高的一个词汇,随着热度不断攀升,隐隐到了“万物皆可卷”的程度。 在程序员职场上,什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事,我们可以帮他。 是技术太强的人吗?也不…

【文献分享】KITTI里程计排行榜上第五!CT-ICP:实时弹性激光雷达里程计与回环检测

论文题目:CT-ICP: Real-time Elastic LiDAR Odometry with Loop Closure 中文题目:CT-ICP:实时弹性激光雷达里程计与回环检测 作者:Pierre Dellenbach, Jean-Emmanuel Deschaud, Bastien Jacquet and Francois Goulette 作者机构&#xff…

逻辑代数运算

逻辑代数运算中的三种基本运算 与(AND):只有满足全部条件,才会产生结果 或(OR) :只要满足一个条件,就会产生结果 非(NOT):只要满足条件&#xff…

14-4_Qt 5.9 C++开发指南_QUdpSocket实现 UDP 通信_UDP组播

文章目录 1. UDP组播的特性2. UDP 组播实例程序的功能3. 组播功能的程序实现4. 源码4.1 可视化UI设计4.2 mainwindow.h4.3 mainwindow.cpp 1. UDP组播的特性 下图简单表示了组播的原理。UDP 组播是主机之间“一对一组”的通信模式,当多个客户端加入由一个组播地址定…

爆卖1.5万件!这款美牙神器成TikTok“现象级爆款!

在大多数美国人心中,健康洁白的牙齿是自信社交的底气,这使得他们对牙齿美白格外重视。 特看数据显示,TikTok Shop美国小店有一款“牙齿美白套件”近两个多月以 300 元的客单价爆卖 1.5 万件,截至7月 26日,产品近7 天共…

HTML基础铺垫

😊HTML基础铺垫 👻前言📜HTML文档结构🎭头部head🥏标题title标记🥏元信息meta标记 🎭主体body🥏body标记🥏body标记属性 🎭HTML基本语法🥏标记类型…

最新SecureCRT 中文注册版

SecureCRT是一款由VanDyke Software公司开发的终端仿真软件,它提供了类似于Telnet和SSH等协议的远程访问功能。SecureCRT专门为网络管理员、系统管理员和其他需要保密访问网络设备的用户设计。 软件下载:SecureCRT for ma注册版 远程访问:Sec…

海外市场品牌定位策略:打造独特品牌形象的关键步骤

在海外市场建立品牌,品牌定位是至关重要的一环。品牌定位是指企业在目标市场中通过一系列战略来塑造品牌形象和传达品牌价值,以区别于竞争对手并满足目标客户的需求和愿望。 在国际化的背景下,品牌定位需要更加细致入微和深思熟虑&#xff0…

《Linux从练气到飞升》No.07 Linux第一个小程序-进度条的实现

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…

vue SKU已知sku.tree算出sku.list类目值和id

已知sku.tree算出sku.list类目值和id <van-skuref"sku"v-model"showBase":close-on-click-overlay"closeOnClickOverlay":goods"skuData.goods_info":goods-id"skuData.goods_id":hide-stock"skuData.sku.hide_stoc…

Android Ble蓝牙App(二)连接与发现服务

Ble蓝牙App&#xff08;二&#xff09;连接与发现服务 前言正文一、GATT回调二、连接和断连三、连接状态回调四、发现服务五、服务适配器六、显示服务七、源码 前言 在上一篇中我们进行扫描设备的处理&#xff0c;本文中进行连接和发现服务的数据处理&#xff0c;运行效果图如下…