伪指令分为以下四类
- 符号定义伪操作 global, local, set, equ
- 数据定义伪操作 byte, short, word, long, quad, float, space, skip, string, ascii, asciz, rept
- 汇编控制伪操作 if, else, endif, macro, endm, exitm
- 杂项伪操作 align, section, data, text, include, arm, code, thumb, weak, end
伪指令作用和使用方法详解
伪指令使用格式: .伪指令
1、符号定义伪操作
符号定义作用:定义全局变量或局部变量、给全局变量或局部变量赋值
①全局标号定义,伪指令.global
作用:定义一个全局符号,通常是为连接器ld使用
格式:.global symbol 等价于 .globl symbol。
②局部标号定义伪指令.local
作用:定义对外部不可见的局部符号,作用域仅在当前文件中
格式: .local symbol
③变量赋值 伪指令.set
作用:给一个全局变量或局部变量赋值
格式:.set symbol, expr 示例.set start, 0x50
④宏替换 伪指令.equ
作用:给一个全局变量或局部变量赋值
格式: .equ Symbol, expr (部分教程写法为Symbol .equ expr,经试验此写法编译不通过,有知道的同学可以说一下)
2、数据定义伪指令
数据定义伪指令作用:为特定的数据分配存储单元、初始化存储单元。简单来就是在当前的位置放一个指定类型的数字
①字节分配伪指令.byte
作用:在存储器中分配一个字节,用指定的数据对其初始化
格式: label: .byte expr (expr为数值)
示例:a: .byte #1 以C语言形式理解为char a=1;
②双字节分配 -------》形式和字节分配相同只是把 .byte替换为 .short ;
③四字节分配 -------》换为.word或.long,四字节分配较为常见,应该是因为32位系统较多。
④八字节分配 -------》换为.quad
⑤单精度浮点变量 -》.float
⑥连续存储区域 伪指令 .space .skip
作用:分配一片连续的存储器区域并初始化
格式:label: .space size, expr 或者 label: .skip size, expr
size指内存字节数,expr为size指定字节的数值
示例:a: .space 8,0x1 以C语言形式为char a[8]={0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1};
⑦字符串定义
作用:定义一个字符串
格式:label: .string str 或 label: .ascii str 或 label: .asciz str 示例如下
a: .string “abc” //分配了4字节(含\0)
a: .ascii “abc” //分配了3字节
a: .asciz “abc” //分配了4字节
⑧重复
作用:重复执行后面的命令
格式:
.rept count /*count 表示重复次数*/
commands /*重复的commands命令体*/
.endr
3、汇编控制操作
作用:控制汇编程序的执行流程
①.选择
作用:根据条件判断,决定是否执行某个指令序列
格式:
.if logical-expression
commands
[ .else
commands]
.endif
.if logical-expression
commands
.elseif logical-expression
commands
[.elseif logical-expression
commands]
.endif
②.宏
作用:定义宏代码段,.macro: 定义一段宏代码, .macro表示代码的开始, .endm表示代码的结束, .exitm跳出宏
4、其他伪操作
①伪指令.align
作用:通过填充字节的方式,使当前位置满足一定的对齐方式
格式: .align abs-expr
示例 .align 2 意为后面的部分以4(2^2)字节对齐。.align 4 @ 以16(2^4)字节对齐
.balignl 16, 0xdeadbeef @ 对齐 + 填充
b表示位填充;align表示要对齐;l表示long,以4字节为单位填充;16表示16字节对齐;0xdeadbeef是用来填充的原料。
②伪指令.section
作用:定义一个段,用于连接器连接时识别。
格式: .section sectioname
③伪指令.data
作用:定义数据段,
格式: .data subsectionname
④伪指令.text
作用:定义指令段或叫代码段
格式: .text subsectioname
⑤伪指令.include
作用:包含头文件
格式: .include “filename”
⑥伪指令.arm
作用:定义一下代码使用arm指令集编译,功能等价于.code32
格式: .arm
⑦伪指令.thumb
作用:定义一下代码使用thumb指令集编译,功能等价于.code16
格式: .thumb
⑧伪指令.weak
作用:声明一个弱符号,即可重新声明覆盖弱声明。
格式: .weak symbol
⑨伪指令.end
作用:汇编结束,不在处理此条指令后的汇编代码
格式: .end
⑩伪指令.extern
作用:声明一个外部符号
格式: .extern symbol
⑪.type
作用:用于定义符号类型
格式:.type symbol whichtype
示例:.type .type Reset_Handler, %function 定义Reset_Handler为函数。具体用途不是很清楚,查了很多资料都没解释 。