ARM 汇编器中的伪指令(Assembler Directives)
📚 系列文章提示
本文来自《ARM汇编指令深入解析》系列教程。如果你想要:
- 查找其他ARM汇编指令的讲解
- 了解本系列的整体结构
- 按顺序系统学习ARM汇编
请访问:系列导读与目录总览

文章目录
- [ARM 汇编器中的伪指令(Assembler Directives)](#ARM 汇编器中的伪指令(Assembler Directives))
-
- 一、伪指令概述
- 二、主要类别和常用伪指令
-
- [1. 数据定义伪指令](#1. 数据定义伪指令)
- [2. 符号定义伪指令](#2. 符号定义伪指令)
- [3. 段定义伪指令](#3. 段定义伪指令)
- [4. 对齐和填充伪指令](#4. 对齐和填充伪指令)
- [5. 条件汇编伪指令](#5. 条件汇编伪指令)
- [6. 宏定义伪指令](#6. 宏定义伪指令)
- [7. 文件包含伪指令](#7. 文件包含伪指令)
- 三、特殊伪指令
-
- [1. 指令集选择伪指令](#1. 指令集选择伪指令)
- [2. 架构和处理器指定](#2. 架构和处理器指定)
- 四、常用伪指令组合示例
-
- [1. 程序框架](#1. 程序框架)
- [2. 数据结构定义](#2. 数据结构定义)
- 五、注意事项
- 六、调试相关的伪指令
一、伪指令概述
伪指令(Directives/Pseudo-instructions)是ARM汇编器提供的一些特殊指令,它们不是真正的处理器指令,而是给汇编器的指令,用于控制汇编过程、定义数据、分配内存等。
二、主要类别和常用伪指令
1. 数据定义伪指令
assembly
.byte ; 定义一个或多个字节
.hword ; 定义半字(16位)
.word ; 定义字(32位)
.quad ; 定义双字(64位)
.float ; 定义单精度浮点数
.double ; 定义双精度浮点数
.ascii ; 定义字符串(不以空字符结尾)
.asciz ; 定义以空字符结尾的字符串
示例:
assembly
data1: .byte 0x12, 0x34 ; 两个字节
data2: .word 0x12345678 ; 一个32位字
str1: .ascii "Hello" ; 5个字节的字符串
str2: .asciz "World" ; 6个字节(包括'\0')
2. 符号定义伪指令
assembly
.equ/.set ; 定义符号常量
.global ; 声明全局符号
.extern ; 声明外部符号
示例:
assembly
.equ BUFFER_SIZE, 1024
.global main
.extern printf
3. 段定义伪指令
assembly
.section ; 定义或切换段
.text ; 切换到代码段
.data ; 切换到数据段
.bss ; 切换到未初始化数据段
.rodata ; 切换到只读数据段
示例:
assembly
.section .text ; 代码段
main:
ldr r0, =message
.section .data ; 数据段
message:
.asciz "Hello, ARM!"
.section .bss ; 未初始化数据
buffer:
.space 1024 ; 分配1024字节
4. 对齐和填充伪指令
assembly
.align ; 对齐到指定边界
.balign ; 字节对齐
.p2align ; 以2的幂次对齐
.space/.skip; 分配指定字节空间
示例:
assembly
.align 2 ; 对齐到4字节边界(2^2)
.word 0x1234
.balign 8 ; 对齐到8字节边界
.quad 0x12345678
.space 100 ; 分配100字节空间
5. 条件汇编伪指令
assembly
.if/.else/.endif ; 条件汇编
.ifdef/.ifndef ; 测试符号是否定义
示例:
assembly
.equ DEBUG, 1
.if DEBUG == 1
bl debug_print
.else
nop
.endif
6. 宏定义伪指令
assembly
.macro/.endm ; 定义宏
示例:
assembly
.macro PUSH_REGS
stmfd sp!, {r0-r12, lr}
.endm
.macro POP_REGS
ldmfd sp!, {r0-r12, pc}
.endm
PUSH_REGS ; 展开为压栈指令
POP_REGS ; 展开为出栈指令
7. 文件包含伪指令
assembly
.include ; 包含其他源文件
三、特殊伪指令
1. 指令集选择伪指令
assembly
.arm ; 切换到ARM指令集
.thumb ; 切换到Thumb指令集
.code 16 ; Thumb模式
.code 32 ; ARM模式
2. 架构和处理器指定
assembly
.arch ; 指定目标架构
.cpu ; 指定处理器类型
.fpu ; 指定浮点单元
四、常用伪指令组合示例
1. 程序框架
assembly
.syntax unified ; 统一汇编语法
.arch armv7-a ; 指定架构
.cpu cortex-a8 ; 指定CPU
.fpu neon ; 指定浮点单元
.text ; 代码段开始
.align 2 ; 4字节对齐
.global _start ; 声明全局入口
_start:
/* 程序代码 */
.data ; 数据段
.align 2
my_data:
.word 1, 2, 3, 4
.bss ; 未初始化数据
.align 2
buffer:
.space 1024
2. 数据结构定义
assembly
/* 定义结构体 */
.struct 0
person_name: .space 20
person_age: .word 0
person_height: .float 0.0
person_struct_size = . - person_name
/* 使用结构体 */
person1:
.space person_struct_size
五、注意事项
- 大小写敏感性:大多数伪指令不区分大小写,但习惯使用小写
- 注释符号 :使用
@表示单行注释,/* */表示多行注释 - 伪指令位置:某些伪指令必须在特定段中使用
- 兼容性:不同汇编器(GAS, ARM汇编器等)的伪指令可能略有差异
- 作用域:某些伪指令只在当前文件中有效
六、调试相关的伪指令
assembly
.file ; 指定源文件名
.line ; 设置行号信息
.loc ; 调试位置信息
.stabs ; STABS调试信息
这些伪指令在开发复杂的ARM汇编程序时非常有用,能够帮助开发者更好地组织代码、管理数据和优化程序结构。