伪指令前通常加一个
.
来区分它们与普通的机器指令。.
主要起到区分伪指令和机器指令的作用。伪指令不会生成机器码,而是告诉汇编器如何组织和布局程序,而机器指令是直接由 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 # 结束汇编文件