GNU平台无关
符号定义伪指令
.global,
.local,
.set,
.equ.global
使得符号对连接器可见,变为对整个工程可用的全局变量
.global symbol.local
表示符号对外部不可见,只对本文件可见
.local symbol.set
给一个全局变量或局部变量赋值,和
.equ的功能一样
.set symbol expr.set start, 0x40.set start, 0x50mov r1, #start;r1里面是0x50.equ
和
.set一样,只是格式不同
symbol .equexprstart.equ, 0x40start.equ, 0x50mov r1, #start;r1里面是0x50数据定义伪指令
.byte,
.short,
.long,
.quad,
.float,
.string,
.asciz,
.ascii,
.rept.byte
在存储器中分配
1个字节,用指定的数据对存储单元进行初始化
label:.byte expr;label是程序标号,expr可以是-128~255的数字,也可是字符a:.byte #1;等价于C中的char a=1;.short
在存储器中分配
2个字节,用指定的数据对存储单元进行初始化
a: .short 0x1234.word / .long
在存储器中分配
4个字节,用指定的数据对存储单元进行初始化
a: .word 0x12345678.long
在存储器中分配
个字节,用指定的数据对存储单元进行初始化
.quad
在存储器中分配
8个字节,用指定的数据对存储单元进行初始化
a: .quad 0x12345678 ;等价于C中的long a=0x1234567812345678.float
在存储器中分配
4个字节,用指定的
浮点数据对存储单元进行初始化
a: .float 1.11.space/.skip
用于分配一块连续的存储区域并初始化为指定的值,如果后面的填充值省略不写则在后面填充为0;
label: .space size,expr ;expr可以是4字节以内的浮点数 a:space 8, 0x1.string
定义一个字符串,默认是string8,还有string16,string32,string64
a: .space "hello world!".rept
重复执行接下来的指令,以.rept开始,以.endr结束
.rept cnt ;cnt是重复次数....endr汇编控制伪操作
流程控制伪指令主要yy
.if .else .endif .macro .endm .exitm.if .else .endif
.if logical-expression....elseif logical-expression2....else....endif.macro .endm .exitm
该伪指令可以将一段代码定义为一个整体,称为宏指令,然后就可以在程序中通过宏指令多次调用该段代码,而
.exitm指令用来退出当前的宏指令,宏指令可以使用一个或多个参数,当宏操作被展开时,这些参数被相应的值替换。
包含在
.macro和
。endm之间的指令序列称为宏定义体。在宏定义体的第一行应声明宏的原型,包含宏名所需的参数,然后就可以在汇编程序中通过宏名来调用该指令序列,在源程序被编译时,汇编器将宏调用展开,用宏定义中的指令序列代替程序中的宏调用,并将实际参数的值传递给宏定义中的形式参数
.macro macroname macargs ...;code.endm杂项
.align用于使程序当前位置满足一定的对齐方式.section用来定义一个段的伪指令.data 用来定义一个数据段.text 用来定义一个代码段.include用来包含一个头文件 .arm定义以下代码使用arm指令集编译.code 32同.arm.code 16同.thumb.thumb定义以下代码使用thumb指令集编译.extern 用于声明一个外部符号,用于兼容性其他汇编.weak 用于声明一个弱符号,如果这个符号没有定义,编译就忽略,而不会报错.end表示汇编结束GNU平台相关
ADR
把标签所在的地址加载到寄存器中,这个指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。当地址值是字节对齐的时候,取值范围是-255~255B;当地址值是字对齐的时候,取值范围为-1020~1020B。当地址值是16字节对齐时,取值范围更大。 该指令等价于
add <reg>, pc , offsetADR <reg> <label>ADRL
用于将中等范围地址读取到寄存器中
ADRL <reg> <label>LDR
装载一个32位的常数和一个地址寄存器
LDR reg, =exprreg:目标寄存器
expr:32位常量表达式。汇编器根据expr的取值情况,对LDR伪指令做如下处理:
- 当expr表示的指令地址值没有超过MOV指令或MVN指令的地址取值范围时,汇编器用一对MOV和MVN代替LDR指令
- 当超过了的时候,汇编器将常数放入缓存吃,同时用一条基于PC的LDR读取该常数
LDR R3,=0xff0;将常熟0xff0读到内存中相当于MOV R3, #0xff0LDR R1,=0xfff ;将常数0xfff读到内存,;相当于LDR R1,[pc, offset_to_litpool]... litpool DCD 0xfffLDR R2, =place;将place标号的地址读入到R1中;相当于LDR R1,[pc, offset_to_litpool]... litpool DCD place本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-11/137136.htm