常见ARM汇编指令伪指令实战总结:
1. .global/.globl: 定义全局标识符,其中标号_start是GNU链接器⽤来指定第⼀个要执⾏指令所必须的,同样的是全局可见的。
2. .section 命令是汇编语⾔汇中最为重要的命令之⼀,作⽤是定义内存段,该命令后只跟⼀个参数,即它声明的段的类型。
例如:
.section .text #定义⽂本段(代码段)
.section .data #定义数据段
.section .bss #定义 bss 段
再例如:
.section ".vectors", "ax" #指定以下代码段必须存放在.vectors段⾥, “ax”表⽰该段可执⾏并且可分配
3. .word 定义⼀个变量。
4.ldr 分为指令和伪指令,伪指令第⼆个参数带 = ;
例⼀:ldr r0, 0x87800000 #将地址为0x87800000的数据存放到r0,这是mov做不到的;
例⼆:ldr r0, =0x87800000 #将地址0x87800000存放到r0;
例三:ldr r0, =_start #将_start标识符赋值给r0, 可以通过bx r0直接复位;
5.ENTRY 伪指令,⽤于指定汇编程序的⼊⼝点。这个伪指令⽐较难理解,其实这是⼈为定义的⼀个宏,就像世上很多规则, 是⼈设⽴的。解析:
#define ENTRY(name) \
.globl name; \
ALIGN; \
name:
可以看出来,这个伪指令实现了指定⼀个⼊⼝的同时数据对齐,同时提供了⼀个函数⼊⼝。
6.and 该指令⽤来做与运算;
例⼀:and r1, r0, #0x1f #将 r0寄存器的值 和⽴即数 0x1f 做与运算,赋值给r1寄存器;
7.状态寄存器访问指令仅有两条:
MRS: 状态寄存器到通⽤寄存器的传送指令。
MSR: 通⽤寄存器到状态寄存器的传送指令。
8. bic和orr指令:bic为清除,orr为做或运算,在分析u-boot的汇编⽂件的时候,有以下代码:
teq r1,#0x1a #
bicne r0, r0, #0x1f # 如果r1 = 0x1a,清除r0的bit 4:0位
orrne r0, r0, #0x13 # 如果r1 = 0x1a,和将r0 和 0x13做或运算,并保存在r0寄存器
10.sub 指令:减法指令;
汇编指令有多少个mov r0,#0xff
mov r1,#0x77
sub r0,r1 #做r0 - r1的运算,然后将结果保存在r0中;
11.ALIGN 伪指令:通过添加补丁字节,使得当前位置满⾜⼀定的对齐⽅式。
12.伪指令AREA: 可以将程序分为多个ELF格式的段。段名称可以相同,这时,这些同名的段将被放在同⼀个ELF段中。⼀个⼤的程序可以包含多个代码段和数据段。⼀个汇编程序⾄少包含⼀个段。
13.END伪指令(对应ENTRY())伪指令):告诉编译器已经到了源程序结尾。
14.EXPORT 和 GLOBAL:同义词,声明⼀个符号可以被其它⽂件引⽤,类似于全局变量。
15.(源⽂件都有源⽂件符号表)IMPORT伪指令告诉编译器某个符号不是在本源⽂件定义的,⽽是在起它源⽂件定义的,本源⽂件可能要引⽤该符号。
16.
(随时更)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论