伪指令前通常加一个 .
来区分它们与普通的机器指令。
.
主要起到区分伪指令和机器指令的作用。伪指令不会生成机器码,而是告诉汇编器如何组织和布局程序,而机器指令是直接由 CPU 执行的。
.text 和 .data 放在一起,表示不区分代码段、数据段
以 .
开头的伪指令是汇编器(Assembler)提供的 汇编器指令(Assembler Directives),用于控制汇编过程、定义数据、布局内存等。以下是常见的 RISC-V 汇编器指令及其作用的分类表格:
1. 数据定义伪指令
伪指令 | 格式 | 作用 |
---|
.data | .data | 切换到数据段,后续定义的数据将存储在数据段中。 |
.rodata | .rodata | 切换到只读数据段,后续定义的数据将存储在只读数据段中。 |
.bss | .bss | 切换到未初始化数据段(BSS 段),后续定义的数据将存储在 BSS 段中。 |
.byte | .byte value1, value2, ... | 定义一个或多个字节数据。 |
.half | .half value1, value2, ... | 定义一个或多个半字(2 字节)数据。 |
.word | .word value1, value2, ... | 定义一个或多个字(4 字节)数据。 |
.dword | .dword value1, value2, ... | 定义一个或多个双字(8 字节)数据。 |
.asciz | .asciz "string" | 定义一个以空字符(\0 )结尾的字符串。 |
.string | .string "string" | 定义一个字符串(与 .asciz 类似)。 |
.space | .space size | 分配指定大小的未初始化空间(以字节为单位)。 |
2. 内存布局伪指令
伪指令 | 格式 | 作用 |
---|
.org | .org address | 设置当前段的位置计数器为指定地址。 |
.align | .align n | 将当前位置对齐到 2^n 的边界。 |
.skip | .skip size | 跳过指定大小的字节(与 .space 类似)。 |
3. 符号定义伪指令
伪指令 | 格式 | 作用 |
---|
.globl | .globl symbol | 声明一个全局符号,使其对其他文件可见。 |
.local | .local symbol | 声明一个局部符号,使其仅在当前文件中可见。 |
.weak | .weak symbol | 声明一个弱符号,如果未定义则不会报错。 |
.equ | .equ name, value | 定义一个符号常量。 |
.set | .set name, value | 定义一个符号常量(与 .equ 类似)。 |
4. 段控制伪指令
伪指令 | 格式 | 作用 |
---|
.text | .text | 切换到代码段,后续定义的指令将存储在代码段中。 |
.section | .section name | 切换到指定名称的段。 |
.previous | .previous | 切换回上一个段。 |
5. 条件伪指令
伪指令 | 格式 | 作用 |
---|
.if | .if condition | 如果条件为真,则汇编后续代码。 |
.else | .else | 与 .if 配合使用,表示条件为假时的代码块。 |
.endif | .endif | 结束条件汇编块。 |
.ifdef | .ifdef symbol | 如果符号已定义,则汇编后续代码。 |
.ifndef | .ifndef symbol | 如果符号未定义,则汇编后续代码。 |
6. 程序入口与结束伪指令
伪指令 | 格式 | 作用 |
---|
.entry | .entry | 定义程序入口点(通常由链接器使用)。 |
.end | .end | 标记汇编文件的结束。 |
7. 其他伪指令
伪指令 | 格式 | 作用 |
---|
.include | .include "filename" | 包含另一个汇编文件。 |
.macro | .macro name arg1, arg2, ... | 定义一个宏。 |
.endm | .endm | 结束宏定义。 |
.rept | .rept count | 重复汇编代码块指定次数。 |
.endr | .endr | 结束重复块。 |
示例代码
.data # 切换到数据段
my_var: .word 42 # 定义一个 32 位整数
msg: .asciz "Hello" # 定义一个字符串
.text # 切换到代码段
.globl main # 声明 main 为全局符号
main:
la a0, msg # 加载 msg 的地址到 a0
li a7, 4 # 设置系统调用号为 4(打印字符串)
ecall # 触发系统调用
li a7, 10 # 设置系统调用号为 10(退出程序)
ecall # 触发系统调用
.end # 结束汇编文件