第一部分  汇编语言

汇编语言是二进制指令的文本形式,与二进制指令是一一对应的关系

(汇编)指令:是机器码的助记符,经过汇编器编译后,由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

第二部分:三级流水线架构