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寄存器
9.teq 指令(test equal):用于比较操作数1和操作数2是否相等,把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的异或运算,并根据运算结果更新CPSR中条件标志位的值。
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.
(随时更)