Welcome 微信登录

首页 / 操作系统 / Linux / ARM汇编伪指令

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,string64a: .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伪指令做如下处理:
  1. 当expr表示的指令地址值没有超过MOV指令或MVN指令的地址取值范围时,汇编器用一对MOV和MVN代替LDR指令
  2. 当超过了的时候,汇编器将常数放入缓存吃,同时用一条基于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