汇编器指令分类总结与完整示例
符号定义与声明类
指令 | 功能描述 | 等效C语言 |
---|---|---|
.equ |
定义符号常量 | #define |
.global |
声明全局符号 | extern (声明) |
.weak |
声明弱符号 | __attribute__((weak)) |
完整示例:
节(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
这个综合示例展示了所有分类的汇编器指令在实际程序中的使用方式,形成了一个完整的系统启动代码框架。