[转]ARM汇编伪指令

本文链接:https://blog.csdn.net/IOT2017/article/details/94549394
GUN平台无关
符号定义伪指令
.global,.local,.set,.equ
.global
使得符号对连接器可见,变为对整个工程可用的全局变量,通俗讲就是定义全局变量
eg:
.global symbol

.local
表示符号对外部不可见,只对本文件可见,通俗讲就是定义局部变量
eg:
.local symbol

.set
给一个全局变量或局部变量赋值,和.equ的功能一样
eg:
.set symbol expr
.set start, 0x40
.set start, 0x50
mov r1, #start ;r1里面是0x50

.equ
和.set一样,只是格式不同
eg:
symbol .equ expr
start .equ, 0x40
start .equ, 0x50
mov r1, #start ;r1里面是0x50

数据定义伪指令
.byte,.short,.long,.quad,.float,.string,.asciz,.ascii,.rept
.byte
在存储器中分配1个字节,用指定的数据对存储单元进行初始化
label: .byte expr ;label是程序标号,expr可以是-128~255的数字,也可是字符
eg:
a: .byte #1 ;等价于C语言中的char a=1;

.short
在存储器中分配2个字节,用指定的数据对存储单元进行初始化
eg:
a: .short 0x1234

.long / .word
在存储器中分配4个字节,用指定的数据对存储单元进行初始化
eg:
a: .word 0x12345678

.quad
在存储器中分配8个字节,用指定的数据对存储单元进行初始化
eg:
a: .quad 0x12345678 ;等价于C中的long a=0x1234567812345678

.float
在存储器中分配4个字节,用指定的浮点数据对存储单元进行初始化
eg:
a: .float 1.11

.space /.skip
用于分配一块连续的存储区域并初始化为指定的值,如果后面的填充值省略不写则在后面填充为0;
label: .space size,expr ;expr可以是4字节(32bit)以内的浮点数
eg:
a: space 8, 0x1

.string
定义一个字符串,默认是string8,还有string16,string32,string64
eg:
a: .space “hello world!”

.rpet
重复执行接下来的指令,以.rept开始,以.endr结束
eg:
.rept cnt ;cnt是重复次数

.endr

汇编控制伪操作
流程控制伪指令主要有.if .else .endif .macro .endm .exitm

.if, .else, .endif
.if logical-expression

.elseif logical-expression2

.else

.endif

.macro, .endm, .exitm
该伪指令可以将一段代码定义为一个整体,称为宏指令。然后就可以在程序中通过宏指令多次调用该段代码;而.exitm用于退出当前宏指令,宏指令可以使用一个或多个参数,当宏操作被展开时,这些参数被相应的值替换。包含在.macro和.endm之间的指令序列称为宏定义体。在宏定义体的第一行应该声明宏的原型,包含宏名所需要的参数,然后就可以在汇编程序中通过宏名来调用该指令序列。在源程序被编译时,编译器将宏调用展开,用宏定义中的指令序列代替程序中的宏调用,并将实际参数值传递给宏定义中的形式参数。
eg:
.macro macroname macargs …
…code…
.endm

杂项
.align 用于使程序当前位置满足一定的对齐方式
.section 用来定义一个段的伪指令
.data 用来定义一个数据段
.text 用来定义一个代码段
.include 用来包含一个头文件
.arm 定义以下代码使用arm指令集编译
.code 32 同.arm
.code 16 同.thumb
.thumb 定义以下代码使用thumb指令集编译
.extern 用于声明一个外部符号,用于兼容性其他汇编
.weak 用于声明一个弱符号,如果这个符号没有定义,编译就忽略,而不会报错
.end 表示汇编结束

GUN平台相关
ADR
把标签所在的地址加载到寄存器中,这个指令将基于PC相对偏移的地址或基于寄存器相对偏移的地址值读取到寄存器中。当地址是字节对齐时,取值范围为-255-255B;当地址是字对齐时取值范围是-1020-1020B。该指令相当于 add <reg>, pc, offset
eg:
ADR <reg> <label>

ADRL
用于将中等范围地址读取到寄存器中
ADRL <reg> <label>

LDR
装在一个32位的常数和一个地址寄存器,即将一个32位常数加载到一个寄存器中
ldr reg, =expr
reg:目标寄存器
expr:32位常量
汇编器根据expr的取值情况对ldr伪指令会做一下处理:

当expr表示的指令地址值没有超过MOV指令或MVN指令的地址取值范围时,汇编器用一对MOV和MVN代替LDR指令
当超过了的时候,汇编器将常数放入缓存,同时用一条基于PC的LDR读取该常数
eg:
LDR R3,=0xff0 @将常数0xff0读到内存中相当于MOV R3, #0xff0
LDR R1, =0xfff @将常数0xfff读到内存,相当于LDR R1,[pc, offset_to_litpool] … litpool DCD 0xfff
LDR R2, =place @将place标号的地址读入到R1中,相当于LDR R1,[pc, offset_to_litpool] … litpool DCD place

原文链接:https://blog.csdn.net/IOT2017/article/details/94549394

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值