首页 未命名正文

linux编程_ARM汇编伪指令

云返利网 未命名 2020-05-26 09:08:45 11 0

GNU平台无关

符号界说伪指令

.global,.local,.set,.equ

.global

使得符号对连接器可见,变为对整个工程可用的全局变量

.global symbol

.local

示意符号对外部不能见,只对本文件可见

.local symbol

.set

给一个全局变量或局部变量赋值,和.equ的功效一样

.set symbol expr
.set start, 0x40
.set start, 0x50
mov r1, #start      ;r1内里是0x50

.equ

.set一样,只是花样差别

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的数字,也可是字符
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 , offset

ADR <reg> <label>

ADRL

用于将中等局限地址读取到寄存器中

ADRL <reg> <label>

LDR

装载一个32位的常数和一个地址寄存器

LDR reg, =expr
  1. 当expr示意的指令地址值没有跨越MOV指令或MVN指令的地址取值局限时,汇编器用一对MOV和MVN取代LDR指令
  2. 当跨越了的时刻,汇编器将常数放入缓存吃,同时用一条基于PC的LDR读取该常数
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

【关于云返利网】

云返利网是阿里云、腾讯云、华为云产品推广返利平台,在各个品牌云产品官网优惠活动之外,云返利网还提供返利。您可以无门槛获得阿里云、华为云、腾讯云所有产品返利,在官网下单后就可以领取,无论是自己用、公司用还是帮客户采购,您个人都可以获得返利。云返利网的目标是让返利更多、更快、更简单!详情咨询13121395187(微信同号)