【RISC-V】.pushsection .popsection和.section .previous的区别

规则如下:

.pushsection 和 .popsection维护一个私有的段栈

1、.pushsection行为:

  1. 将当前段(current section)压入段栈。

  2. 切换到指定的name段(如果不存在则创建)。

  3. 后续的汇编代码写入新段。

2、.popscetion行为:

  1. 从段栈弹出最顶层的段名。

  2. 直接切换回该段(作为当前段current section)。

复制代码
.text
    nop
.pushsection .data  # 压栈text
    .byte 42
.pushsection .rodata # 压栈data
    .ascii "hello"
.popsection        # 回到 .data
    .byte 43
.popsection        # 回到 .text
    nop

⚠️⚠️⚠️规则如下:

GAS(GNU Assembler)内部维护previous_section 变量和current_section变量,当

复制代码
.text                # current=.text,    previous=?
    nop
.section .data       # previous=.text,   current=.data
    .byte 42
.section .rodata     # previous=.data,   current=.rodata
    .ascii "hello"
.previous            # 交换:previous=.rodata,current=.data。回到.data段
    .byte 43
.previous            # 再次交换: previous=.data,current=.rodata。回到.rodata段

.text              # previous=?,        current=.text    
    nop
.section .data     # previous=.text,    current=.data    
    .byte 42
.section .rodata   # previous=.data,    current=.rodata   
    .ascii "hello"
.previous          # 交换,previous=.rodata,current=.data。回到data段
.section .init     # 此时在data段,所以previous=.data,    current=.init  
    .byte 43
.previous          # 交换,previous=.init,current=.data。回到data段

自测习题:

回答:最终 .byte 99(或 .quad 99 等)位于 .xxx 段。

1、基础

复制代码
.text
    nop
.section .data
    .byte 1
.previous
    .byte 99

2、稍复杂

复制代码
.text
.section .rodata
.section .data
.previous
.previous
    .byte 99

3、陷阱题

复制代码
.text
.section .init
.section .fini
.previous
.section .data
.previous
    .byte 99

4、混合使用

复制代码
.text
.pushsection .data
.section .rodata
.previous
.popsection
    .byte 99

5、嵌套 push/pop

复制代码
.text
.pushsection .init
.pushsection .data
.section .rodata
.popsection
.previous
    .quad 99

答案:

第一题:.text,第二题:.data,第三题:.init,第四题:.text,第五题:.data

相关推荐
国科安芯19 小时前
星载通信载荷信号处理中抗辐射微控制器的选型与适应性分析
人工智能·嵌入式硬件·mcu·信号处理·risc-v·抗辐射·空间信息
RISCV_Explorer2 天前
RISC-V RVV向量编程模型机制解析——vsetvl配置、掩码与尾元素策略及长度无关编程
后端·risc-v
RISCV_Explorer2 天前
RISC-V电源管理与低功耗实战——WFI指令、电源域划分与唤醒路径设计
单片机·嵌入式硬件·risc-v
ChipCamp2 天前
Spike-pk在RISC-V RTL开发验证中的应用:黄金参考基准
risc-v·spike·difftest·co-simulation·spike-pk·riscv-pk
Hi202402172 天前
Vortex CUDA 生态适配:让 CUDA C、CUTLASS 与 Triton 在 RISC-V GPGPU 上运行
人工智能·risc-v·gpgpu
国科安芯3 天前
用 AS32X601 做一块关节电机驱动板:三相桥、电流采样、封波保护、FOC 代码一次讲透
risc-v·foc·bldc·关节电机·机器人关节·as32x601·三相逆变桥
硅基手札3 天前
【risc-v专栏 07】启动与 bare-metal 流程
risc-v
硅基手札3 天前
【risc-v专栏 08】扩展生态与 -march/-mabi 匹配
risc-v
硅基手札4 天前
【risc-v专栏 06b】内存架构深挖:PMA / ePMP / Cache / CMO / MMU 细节 / RVWMO 形式化
架构·risc-v
硅基手札4 天前
【risc-v专栏03】CSR 速查与特权架构 M/S/U
单片机·架构·risc-v