Linux学习笔记1-1

ARM架构处理器

ARM架构处理器的工作模式:

  1. USR(User):普通应用程序的运行模式
  2. FIQ (Fast Interrupt):快速中断模式,用于处理快速的事件,例如高速数据传输
  3. IRQ (Interrupt):外部中断模式,用于处理通用中断事件
  4. SVC(SuperVisor):又称保护模式,操作系统使用的特权模式
  5. ABT(Abort):数据访问中止模式,用于虚拟存储和存储保护
  6. UND(Undefined):未定义指令终止模式,用于支持通过软件仿真硬件的协处理器
  7. SYS(System):系统模式,用于运行特权级的操作系统任务

注意:Usr为普通模式,其他六个模式为特权模式;除了Usr和Sys模式,其他的五个模式为异常模式


ARM架构处理器的寄存器:

  • 通用寄存器(31)
    1. 不分组寄存器(R0-R7)
    2. 分组寄存器(R8-R14)
    3. PC指针(R15)
  • 状态寄存器(6)
    1. CPSR->Current Program States Register(1)
    2. SPSR->Saved Program States Register(5)
    具体分布如下表:
    这里写图片描述

寄存器的作用

  • 不分组寄存器(R0-R7)

    在所有的运行模式下都可以使用的同一组物理寄存器,他们没有被系统用作特殊寄存器处理,因此在中断或者异常处理进行模式切换的时候,由于不同处理模式使用的是统一组的物理寄存器,所以会造成寄存器中的数据被破坏。

  • 分组寄存器(R8-R14)

    a)对于R8-R12,当使用FIQ(Fast Interrupt)快速中断模式是访问的是R8_fiq-R12_fiq,在使用其他模式的时候访问的是R8-R12


    b)对于R13-R14,每个寄存器都对应6个不同的物理寄存器;在USR(User)用户模式和SYS(System)使用的是同一组物理寄存器R13-R14;
    在SVC(SuperVisor)管理模式下使用R13_svc-R14_svc;
    在IRQ(Interrupt)外部中断模式下使用R13_irq-R14-irq;
    在ABT(Abort)数据访问中止模式下使用R13_abt-R14_abt;
    在UND(Undefined)未定义指令终止模式下使用R13_und-R14_und。
    ① R13在ARM指令中常被用作SP(Stack Pointer)堆栈指针;
    Note:由于每一种模式都有自己的R13,所以我们在自己做初始化的时候一般都要初始化每一种模式下的R13,使它们都指向该运行模式的栈空间。
    ② R14被称为子程序链接寄存器,有两种特殊的功能,一种是每一种模式都可以用于保存函数的返回地址,另外就是异常处理后的返回地址,例如中断。

  • PC指针(R15)

    R15用作程序计数器(Program Counter,Not Person Computer),在任何的模式下都对应同一个物理寄存器,由于ARM体系采用了多级流水线技术,所以PC的值存的是当前取指令操作对应的地址;(流水线总共有三个动作:取指令 –>译码 –>执行)即PC存的值为当前执行指令的后两条指令的地址,在ARM指令集中,当前执行指令的地址为PC-8;在Thumb指令集的地址为PC-4。

  • CPSR(Current Program States Register)

    313029282726-252423-2019-1615-10987654-0
    NZCVQResJRESERVEDGE[3:0]RESERVEDEAIFTM[4:0]

    N:Negative/Less Than
    Z:Zero
    C:Carry/Borrow/Extend
    V:Overflow
    I:IRQ disable
    F:FIQ disable
    T:State bit
    M[4:0]: Mode bits
    1)条件码标志位
    N、Z、C、V、Q均为条件标志位,它们的内容可以被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行,条件标志位的含义如下:

    标志位含义
    N当两个补码表示带符号数进行计算时,N=1表示运算结果为负数;N=0表示运算结果为整数或者为零
    ZZ=1 表示运算结果为零,Z=0表示运算结果非零
    C可以有4种方法设置的C的值:①加法运算(包括CMP):当运算结果产生了进位时(无符号溢出),C=1,否则C=0。②减法运算(包括CMP):当运算产生了借位时(无符号数溢出),C=0,否则C=1。③对于包含移位操作的非加减运算指令,C为移出值的最后一位。④对于其他的非加减运算指令,C的值通常不会改变。
    V可以有两种方法设定V的值:①对于加减运算指令,当操作数和运算结果为二进制的补码表示带符号数时,V=1表示符号溢出,否则V=0;②对于其他非加减运算指令,V的值通常不会改变。
    Q在ARM V5 及以上版本的E系列处理器中,用Q标志位表示增强的DSP运算指令是否发生了溢出。在其他版本的处理器中,Q标志位无定义。

    2)模式标志位

    M[4:0]处理器模式ARM模式下可访问的寄存器THUMB模式下可访问的寄存器
    0B10000用户模式PC,CPSR,R0-R14PC,CPSR,R0-R7,LR,SP
    0B10001FIQ模式PC,CPSR,SPSR_fiq,R14_fiq-R8_fiq,R0-R7PC,CPSR,SPSR_fiq,LR_fiq,SP_fiq,R0-R7
    0B10010IRQ模式PC,CPSR,SPSR_irq,R14_irq-R13_irq,R0-R12PC,CPSR,SPSR_irq,LR_irq,SP_irq,R0-R7
    0B10011管理模式PC,CPSR,SPSR_svc,R14_svc-R13_svc,R0-R12PC,CPSR,SPSR_svc,LR_svc,SP_svc,R0-R7
    0B10111中止模式PC,CPSR,SPSR_abt,R14_abt-R13_abt,R0-R12PC,CPSR,SPSR_abt,LR_abt,SP_abt,R0-R7
    0B11011未定义模式PC,CPSR,SPSR_und,R14_und-R13_und,R0-R12PC,CPSR,SPSR_und,LR_und,SP_und,R0-R7
    0B11111系统模式PC,CPSR,R0-R14PC,CPSR,LR,SP,R0-R7

ARM架构处理器常用指令介绍:

  • ARM寻址方式
    1)立即数寻址
    ADD R0,R0,#0x01; R0 = R0 + 0x01
    2)寄存器寻址
    ADD R1,R2,R3; R1 = R2 + R3
    3)寄存器间接寻址
    LDR R0,[R1]; 将R1里面的值作为数据的地址,将该地址对应的数据赋值给R0,R0 = [R1]
    STR R0,[R1]; 将R0的值存放在R1的值的地址处;[R1] = R0
    4)多寄存器寻址
    LDMIA R0,{R1,R2,R3,R4}; R1 = [R0],R2 = [R0 + 4],R3 = [R0 + 8],R4 = [R0 + 12]

  • ARM汇编指令
    格式:
    {operate} {condition} {S} {Rd},{Rn},{operand2}
    {operate} : 指令操作编码,例如LDR,STR
    {condition} : 指令执行的条件编码,如EQ,NE等
    {S} : 决定指令的执行是否影响CPSR的值
    {Rd} : (Register Destination)目标寄存器编码
    {Rn} : 包括第一个源操作数的寄存器编码
    {operand2} : 第二个操作数

条件码是在ARM指令执行之前,判断是否符合条件,如果符合则执行该指令。
条件码如下表所示:

操作码条件助记符判断的标志位含义
0000EQ(Equal)Z = 1相等
0001NE(Not Equal)Z = 0不相等
0010CS/HS(Carry Set/High or Same)C = 1无符号数大于或者等于
0011CC/LO(Carry Clear/LOwer)C = 0无符号数小于
0100MI(MInus)N = 1负数
0101PL(PLus)N = 0正数或者零
0110VS(oVerflow Set)V = 1溢出
0111VC(oVerflow Clear)V = 0没有溢出
1000HI(Lower or Same)C = 1,Z = 0无符号数大于
1001LS(Lower or Same)C = 0,Z = 1无符号数小于或等于
1010GE(Greater or Equal)N = V有符号数大于或等于
1011LT(Less Than)N != V有符号数小于
1100GT(Greater Than)Z = 0,N = V有符号数大于
1101LE(Less or Equal)Z = 1,N != V有符号数小于或等于
1110AL(ALL)任何条件无条件执行(默认情况)
1111NV任何条件从不执行

1)数据处理指令
Move: MOV R1,R0; R1 = R0
Move Not: MVN R1,R0; R1 = ~R0

Compare: CMP R1,#100; R1 - 100 影响CPSR的条件码标志位
Compare Negative: CMN R1,R0; R1 + R0 影响CPSR的条件码标志位

Test: TST R1,#0xfffe; R1 & 0xfffe 影响CPSR的条件码标志位
Test Equalvalence: TEQ R1,R0; R1^R0 影响CPSR的条件码标志位

Add: ADD R0,R1,R2; R0 = R1 + R2
Add with Carry: ADC R0,R1,R2; R0 = R1 + R2 + CPSR->C
Subtract: SUB R0,R1,R2; R0 = R1 - R2
Reverse Subtract: RSB R0,R1,R2; R0 = R2 -R1
Multiply: MUL R0,R1,R2;R0 = R1*R2

And: AND R0,R0,#3; R0 = R0 & 3
OR :ORR R0,R0,#3; R0 = R0 | 3
Bit clear: BIC R0,R0,#0xfe; R0 = R0 | 0xfe

Load Word: LDR R0,{R1,R2}; 将存储地址为R1+R2的字数据读入到寄存器R0
LDR R0,{R1,R2}!;将存储地址为R1+R2的字数据读入到寄存器R0,并将新地址写入到R1
Store: STR R0,[R1],#8;将R0中的字数据写入到R1+8的地址

Move PSR to Register: MSR CPSR,R0;将R0的内容写入到CPSR中
Move Register to PSR: MRS R0,CPSR;传送CPSR的内容到寄存器R0
2)跳转指令
Branch: B Label; 程序无条件跳转到标号Label处执行
Branch with Link: BL Label;当程序无条件跳转到Label处执行时,同时将当前的PC值保存到R14中(Link Register)
Branch with Link and exchange: BLX Label;从ARM指令集跳转到Label所指定的目标地址,并将处理器的工作状态由ARM状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中
Branch and exchange: BX Label;跳转到Label所指定的目标地址,目标地址的指令既可以是ARM指令也可以是Thumb指令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值