【学习随记】汇编语言_伪指令大全

January 04, 2023

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

Profile picture

Written by JokerDebug who works at Southeast University, Nanjing, China You can follow me on Github