跳转至

汇编器指令分类总结与完整示例

符号定义与声明类

指令 功能描述 等效C语言
.equ 定义符号常量 #define
.global 声明全局符号 extern(声明)
.weak 声明弱符号 __attribute__((weak))

完整示例:

.equ    STACK_SIZE, 1024
.equ    VERSION, 2
.global _start
.global main
.weak   fallback_handler

节(Section)定义类

指令 功能描述 用途
.text 进入代码段 包含可执行指令
.data 进入数据段 包含已初始化数据
.bss 进入BSS段 包含未初始化数据
.section 自定义节 创建特殊用途的节

完整示例:

.text
.balign 4
_start:
    la sp, stack_top

.data
.balign 8
global_var: .word 0x12345678

.bss
.lcomm buffer, 256

.section .init_array, "aw"
    .word init_func1

数据分配与内存预留类

指令 功能描述 等效C语言
.skip 预留未初始化空间 数组声明
.space 同.skip 同.skip
.byte 分配字节数据 char[]
.half 分配半字数据 short[]
.word 分配字数据 int[]
.dword 分配双字数据 long[]
.asciz 分配以null结尾的字符串 char[]
.string 同.asciz 同.asciz

完整示例:

.data
byte_array:    .byte 0x01, 0x02, 0x03
half_data:     .half 0x1234
word_data:     .word 0x12345678
dword_data:    .dword 0x1234567890ABCDEF
message:       .asciz "Hello, World!"
filename:      .string "data.bin"

.bss
buffer_space:  .skip 1024
temp_storage:  .space 512

对齐控制类

指令 功能描述 用途
.balign 字节对齐 地址对齐
.align 对齐(通常按字) 地址对齐
.p2align 2的幂次对齐 精确对齐控制

完整示例:

.text
.balign 16      # 16字节对齐
entry_point:
    nop

.data
.align 4        # 4字节对齐
aligned_data:
    .word 0, 0, 0, 0

.section .rodata
.p2align 3      # 8字节对齐 (2^3)
readonly_array:
    .dword 1, 2, 3, 4

条件汇编类

指令 功能描述 用途
.if 条件汇编开始 条件编译
.else 条件汇编否则分支 条件编译
.endif 条件汇编结束 条件编译
.macro 定义宏 代码复用
.endm 宏定义结束 代码复用

完整示例:

.equ DEBUG, 1
.equ ARCH_RV64, 1

.if DEBUG
.equ LOG_LEVEL, 3
.else
.equ LOG_LEVEL, 1
.endif

.macro save_registers
    addi sp, sp, -64
    sd ra, 0(sp)
    sd s0, 8(sp)
.endm

.macro restore_registers
    ld s0, 8(sp)
    ld ra, 0(sp)
    addi sp, sp, 64
.endm

.if ARCH_RV64
.macro load_ptr reg, addr
    ld \reg, \addr
.endm
.else
.macro load_ptr reg, addr
    lw \reg, \addr
.endm
.endif

文件控制类

指令 功能描述 用途
.include 包含其他文件 文件包含
.file 指定源文件名 调试信息
.end 标记文件结束 文件结束

完整示例:

.file "main.s"

.include "macros.s"
.include "config.s"

.text
.global main

main:
    # 主程序代码
    call initialize
    call run_main_loop
    ret

.include "utils.s"

.end

调试信息类

指令 功能描述 用途
.size 设置符号大小 调试信息
.type 设置符号类型 调试信息
.loc 源代码位置 调试信息

完整示例:

.file "program.s"
.loc 1 1

.text
.global calculate_sum
.type calculate_sum, @function
calculate_sum:
.loc 1 5
    add a0, a0, a1
    ret
.size calculate_sum, . - calculate_sum

.loc 1 10
.global process_data
.type process_data, @function
process_data:
    # 函数体
    ret
.size process_data, . - process_data

综合完整示例

# 系统启动代码 - 综合示例
.file "startup.s"

# 常量定义
.equ STACK_SIZE, 2048
.equ MAX_TASKS, 8
.equ ENABLE_DEBUG, 1

# 全局符号
.global _start
.global main
.weak default_handler

# 宏定义
.macro PROLOGUE
    addi sp, sp, -32
    sd ra, 0(sp)
    sd s0, 8(sp)
.endm

.macro EPILOGUE
    ld s0, 8(sp)
    ld ra, 0(sp)
    addi sp, sp, 32
.endm

# 条件编译
.if ENABLE_DEBUG
.equ LOG_BUFFER_SIZE, 1024
.else
.equ LOG_BUFFER_SIZE, 256
.endif

# 代码段
.text
.balign 16

_start:
    la sp, stack_top
    j main

.type main, @function
main:
    PROLOGUE

.if ENABLE_DEBUG
    call debug_init
.endif

    call system_init
    call app_main

    EPILOGUE
    ret
.size main, . - main

# 数据段
.data
.balign 8

system_config:
    .word 0xCAFEBABE
    .half 0x1234
    .byte 0x01, 0x02

welcome_message:
    .asciz "System Boot Complete\n"

# BSS段
.bss
.balign 16

stack_bottom:
    .skip STACK_SIZE
stack_top:

log_buffer:
    .skip LOG_BUFFER_SIZE

# 文件包含
.include "system_init.s"
.include "debug.s"

.end

这个综合示例展示了所有分类的汇编器指令在实际程序中的使用方式,形成了一个完整的系统启动代码框架。