You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GNU汇编中.org指令在段外使用是否合规及AArch64启动代码疑问

AArch64启动代码中.org指令的疑问解答

先看你提供的代码片段:

.org 0
.text

.globl _boot
.globl _vector_table

... 

.org 0
.section .vectors

...

问题1:.text指令之前的表达式属于哪个段?

在.text指令执行前,汇编器还未切换到任何命名段,此时处于汇编器默认的初始临时段(可理解为未命名的过渡段)。这段代码里的.org 0就是在这个临时段中执行的,直到.text指令才正式切换到代码段(text section)。

问题2:.text指令之前的.org指令作用是什么?为何首次使用后再次出现?

先明确.org <addr>的核心作用:它是汇编器伪指令,强制将当前段的程序计数器(PC)定位到指定地址,后续代码或数据从该地址开始排布;若当前PC已超过指定地址,多数汇编器会报错(部分支持填充字节到目标地址)。

  • 第一个.org 0的作用:
    在.text之前执行,是为了确保后续.text段的起始地址严格对齐到地址0。AArch64处理器的复位向量通常要求位于地址0处,显式用.org 0能强制后续启动代码(_boot等符号)从地址0开始排布,避免汇编器默认对齐规则导致起始地址偏移。

  • 第二次.org 0的作用:
    此时已通过.section .vectors切换到向量表专用段(vectors section),每个段在汇编阶段是独立的地址空间(链接时会被映射到内存的不同区域)。这里的.org 0是让.vectors段的本地偏移量从0开始,确保向量表的第一条向量(比如复位向量)位于该段起始位置,方便链接器将整个.vectors段映射到符合AArch64要求的内存地址(比如向量表需对齐到0x80的倍数)。

.org指令使用示例

示例1:在代码段内调整地址,插入填充字节

.text
start:
    mov x0, #1          ; 占4字节,地址为start
    .org start + 8      ; 将PC定位到start+8,中间4字节(start+4到start+7)会被填充0
    mov x1, #2          ; 从start+8地址开始执行

示例2:在数据段指定起始地址

.section .data, "w"
.org 0x1000            ; 让.data段的起始地址从0x1000开始(链接时映射到内存0x1000)
var1: .word 0x1234     ; 地址0x1000
var2: .word 0x5678     ; 地址0x1004

示例3:多段独立使用.org(模拟你的场景)

.org 0                  ; 初始临时段定位到0
.text
_boot:
    b reset_handler     ; 从地址0开始执行

.org 0                  ; 切换到vectors段后,段内偏移定位到0
.section .vectors
reset_handler:
    ldr x0, =0x80000000 ; 向量表起始位置(段内偏移0)
    mov sp, x0
    b main

内容的提问来源于stack exchange,提问作者김태윤

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 21:40:09