第一部分 汇编语言
汇编语言是二进制指令的文本形式,与二进制指令是一一对应的关系
(汇编)指令:是机器码的助记符,经过汇编器编译后,由CPU执行。
(汇编)伪指令:用来指导指令执行,是汇编器的产物,最终不会生成机器码。
常用汇编指令:
1、相对跳转指令:b、bl
这两条指令的不同之处在于bl指令除了跳转之外,还将返回地址(bl的下一条指令的地址)
保存在lr寄存器中,这两条指令的跳转范围是当前指令的前后32MB,它们是位置无关的指令。
2、数据传送指令:mov,地址读取伪指令:ldr
mov可以把一个寄存器的值赋给另一个寄存器,也可以把一个常量赋值给寄存器。
mov r1, r2
mov r1, #4096
ldr本意为“大范围的地址读取伪指令”。
3、内存访问指令:ldr、str、ldm、stm
ldr 从内存中读取数据到寄存器;
ldr r1, [r2, #4] //将地址为r2+4的内存单元的数据读取到r1中。
ldr r1, [r2] //将地址为r2的内存单元中的数据读取到r1中。
ldr r1, [r2], #4 //将地址为r2的内存单元中的数据读取到r1中,然后r2=r2+4。
str 将寄存器的数据存放在内存中;
str r1, [r2, #4] //将r1中的数据保存到地址为r2+4的内存单元中。
str r1, [r2] //将r1中的数据保存到地址为r2的内存单元中。
str r1, [r2], #4 //将r1中的数据保存到地址为r2的内存单元中,然后r2=r2+4。
ldm和stm属于批量内存访问指令,只用一条指令就可以读取多个数据。
4、加减指令:add、sub
add r1, r2, #1 //表示r1=r2+1
sbb r1, r2, #1 //表示r1=r2-1
5、程序状态寄存器访问指令:msr、mrs
ARM处理器有一个程序状态寄存器(cpsr),它用来控制处理器的工作模式,设置中断的总开关。
msr cpsr, r0 //复制r0到cpsr中
mrs cpsr, r0 //复制cpsr到r0中
6、其它伪指令
.extern main //".extern"定义一个外部符号(可以是变量,也可以是函数),改代码表示
本文件中引用的main是一个外部函数
.text //表示下面的语句都属于代码段
.global _start //将本文件中的某个程序标号定义为全局的,比如该代码表示_start是个全局函数。
_start:
指令
1、8种寻址方式
寄存器寻址
立即寻址
寄存器移位寻址
寄存器间接寻址
基址寻址
多寄存器寻址
堆栈寻址
相对寻址
2、6类指令:
数据处理指令:
数据传输指令, MOV MVN
算术指令, ADD SUB RSB ADC SBC RSC
逻辑指令, AND ORR EOR BIC
比较指令, CMP CMN TST TEQ
乘法指令, MUL MLA UMULL UMLAL SMULL SMLAL
前导零计数。
程序状态寄存器访问指令:MRS MSR
跳转指令: B BL BX
访存指令: LDR/STR LDM/STM SWP
异常中断产生指令: SWI
协处理器指令: mcr mrc
3、LDR/STR架构
LDR LDRB LDRH LDRSB LDRSH
STR STRB STRH STRSB STRSH
LDM/STM
SWP SWPB
4、指令后缀:B H S
5、条件后缀:
EQ/NE:等于/不等于(equal / not equal)
HS/LO:无符号数高于或等于/无符号数小于(higher or same/lower)
HI/LS:无符号数高于/无符号数低于或等于(higher/lower or same)
GE/LT:有符号数大于或等于/有符号数小于(greater or equal/less than)
GT/LE:有符号数大于/有符号数小于或等于(greater than/less or equal)
MI/PL:负/非负
VS/VC:溢出/不溢出(overflow set / overflow clear)
CS/CC:进位/无进位(carry set / carry clear
6、ldm/stm与栈的操作
ldmfd/stmfd
ldmia/stmia
7、合法、非法立即数
伪指令(gnu汇编伪指令)
ARM汇编程序常用的编译环境有2个:ARMASM(ARM官方汇编格式,Windows中常用,如ADS、MDK,指令一般用全大写)和GNU ARM ASM(开源社区常用,如uboot、linux,指令一般全小写)。
@开头的之后部分是注释(@不一定非在行首,类似于C中的//)
#开头的整行注释。一般整行注释用#而前面是代码后面写注释的用@
:结尾的是标号
标号+f,表示在引用处向前找;标号+b,表示在引用的地方向后查找; 局部标号一般用数字1、2
点号“.”在汇编中表示当前指令的地址
直接操作数前缀用#或$
.global xx(有时写为.globl) 给符号xx外部链接属性,一般为了在别的文件中引用这个符号
.section .mysection 自定义数据段,段名为“.mysection”
.align 2 4字节对齐
.balign/.balignw/.balignl 字节/2字节/4字节填充
注意.align数字是2的n次方,而.balign数字是直接数字
.ascii "string..." 定义一个ascii字符串
.byte .short .long .word .quad .float .string .ascii
.equ .set 赋值语句
.end 文件结束
.include 头文件包含
.if .else .endif 条件编译,类似于C语言的#if #elif #endif
.arm / .code32 以ARM指令格式编译
.thumb / .code16 以thumb指令格式编译
nop
ldr
adr
宏定义
.macro macroname
宏体
.endm
第二部分:三级流水线架构