【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

相关推荐
MounRiver_Studio7 小时前
原生集成AI 能力的 RISC-V IDE:第三代 MounRiver Studio 正式发布
ide·ai·agent·risc-v
Imagination官方博客21 小时前
从开源驱动到完整软件栈:Imagination 助力 RISC-V 图形生态发展
开源·risc-v
国科安芯1 天前
开放指令集的空间之路:RISC-V微控制器在商业航天中的生态价值与自主性评述
嵌入式硬件·mcu·risc-v·低轨卫星·商业航天·抗辐射
潜创微科技1 天前
CH592:集成 BLE 的青稞 RISC-V 无线 MCU
c语言·单片机·risc-v·无线投屏·低延迟·沁恒
dadaobusi2 天前
学习:RISC-V 虚拟化/H 扩展 语境 VTW 和 VTVM
risc-v
潜创微科技2 天前
CH591:成本优化的青稞 RISC-V 无线 MCU
c语言·单片机·risc-v·低延迟·沁恒·青稞
玄芯散人5 天前
【元婴·94】ARM vs RISC-V大战
arm开发·risc-v
Yyq130208696826 天前
紫荆M100,RISC-V开源架构,工业控制,电机驱动,国产替代
单片机·嵌入式硬件·risc-v
国科安芯7 天前
立方星与微纳卫星综合电子微型化趋势下的抗辐射MCU选型综述
人工智能·单片机·嵌入式硬件·mcu·risc-v·抗辐射
luoganttcc9 天前
RISC-V 指令集与机器码:从 32 位编码到程序执行
risc-v·计算机体系