嵌入式期末 第三章

ARM处理器指令集

3.1指令简介

  • 指令
    定义:能够指示处理器执行某种运算的命令(如加、减、乘、.......)

  • 程序是指令的有序集合。

  • 指令集
    定义:处理器能识别指令的集合,称为指令集

  • ARM指令在汇编程序中用助记符表示,格式为:
    <opcode>{<cond>} {S} <Rd>,<Rn> {,<operand2> }

    说明:

    1. 指令操作码,如ADD表示算术加操作指令;
    2. {}决定指令执行的条件码;
    3. {S}是否更新CPSR中的标志位值,写时更新 ,否则不更新;
    4. 目的寄存器编码;
    5. 包含第一个操作数的寄存器编码;
    6. 第二个操作数,有2种形式: #immed_8r;
  • 指令格式举例:
    LDR R0,[R1]
    将存储器地址为R1的字数据读入寄存器 R0,执行条件AL (总是,可以省略)
    ADDS R1, R1, #1
    加法指令, R1= R1+1, 带S,执行完指令,同时更新CPSR寄存器条件标志位
    SUBNES R1, R1, #0xF
    条件执行减法运算(NE), R1=R1-0XF, 带S则影响CPSR 寄存器

3.2ARM寻址方式

  • 立即寻址、寄存器寻址、寄存器间接寻址、基址加偏址寻址、堆栈寻址、块拷贝寻址、相对寻址

  • 立即寻址
    立即寻址也叫 立即数寻址,操作数本身就在指令中给出,只要取出指令也就取到了操作数,这个操作数被称为 立即数
    例如以下指令:
    ADD R0,R0,#1 /R0←R0+1/
    ADD R0,R0,#0x3f/R0←R0+0x3f/

    1. 立即数写法:第二个源操作数即为立即数,要求以“#”为前缀,对于以十六进制表示的立即数,还要求在“#”后加上“0x”或“&”;“0b”或“%”表示二进制;“0d”或缺省不写表示十进制。立即数一般为 8位
  • 寄存器寻址

    利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。以下指令:

    ADD R0,R1,R2 /R0←R1+R2/

    该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中。

  • 寄存器间接寻址

    寄存器间接寻址:以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令:

    LDR R0,[R1] /R0←[R1]/
    STR R0,[R1] /[R1]←R0/

    LDR(Load Register):将以R1的值为地址的存储器中的数据加载到R0中;
    STR(Store Register):将R0的值传送到以R1的值为地址的存储器中。

  • 基址加偏址寻址
    基址寄存器的地址偏移可以是一个立即数,也可以是另一个寄存器,并且在加到基址寄存器前还可以经过移位操作.如下所示:

    LDR r0,[r1,r2];r0<—mem32[r1+r2]
    LDR r0,[r1,r2,LSL #2];r0<—[r1+r2*4]

    但常用的是立即数偏移的形式,地址偏移为寄存器形式的指令很少使用

  • 堆栈寻址

    堆栈:一个按操作顺序进行存取的存储区(一种数据结构);
    操作顺序:先进后出(First In Last Out,FILO);
    使用一个称作堆栈指针的专用寄存器(SP)指示当前的操作位置,堆栈指针总指向堆栈存储单元的栈顶。

    四种类型的堆栈工作方式

    1. 满递增堆栈(FA):堆栈指针指向最后压入的数据,且由低地址向高地址生成;
    2. 满递减堆栈 (FD):堆栈指针指向最后压入的数据,且由高地址向低地址生成(默认寻址方式);
    3. 空递增堆栈(EA):堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。
    4. 空递减堆栈(ED):堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。

    ARM无专门的堆栈操作指令

  • 快拷贝寻址

  • 相对寻址

3.3ARM指令集详细介绍

  • ARM的数据处理指令主要完成寄存器中数据的 算术和逻辑运算操作

省略

习题

  1. 简述 ARM处理器指令集的特点。
    代码灵活度高;
    简化了复杂度;
    执行指令集时PC每次自增4

  2. ARM处理器指令集的寻址方式有哪些,数据的存储方式有那些?
    立即寻址、寄存器寻址、寄存器间接寻址、基址加偏址寻址、堆栈寻址、块拷贝寻址、相对寻址

  3. 简述堆栈寻址方式的分类.
    堆栈:一个按操作顺序进行存取的存储区(一种数据结构);
    操作顺序:先进后出(First In Last Out,FILO);
    使用一个称作堆栈指针的专用寄存器(SP)指示当前的操作位置,堆栈指针总指向堆栈存储单元的栈顶。

    四种类型的堆栈工作方式

    1. 满递增堆栈(FA):堆栈指针指向最后压入的数据,且由低地址向高地址生成;
    2. 满递减堆栈 (FD):堆栈指针指向最后压入的数据,且由高地址向低地址生成(默认寻址方式);
    3. 空递增堆栈(EA):堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。
    4. 空递减堆栈(ED):堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。
  4. 编写指令实现以下功能:
    (1)将数值 0x80 存入R6;
    MOV R6, #0x80
    (2)将寄存器 APSR 读取存入R5;
    MRS R5, APSR
    (3)将数值 0.5存入R2,并更新标志位;
    VMOV.F32 S2, #0.5
    VMRS APSR_nzcv, FPSCR
    (4)将数值0x12345678存入R2。
    LDR R2, =0x12345678

  5. 编写存储器访问指令实现以下功能:
    (1)从存储器地址[R2+16]中取有符号半字数送入R2,并将R2更新为R2+16;
    LDRSH R2, [R2, #16]
    ADD R2, R2, #16
    (2)将RO中的字数据存入地址为[R1+R2x4]的存储单元中;
    STR R0, [R1, R2, LSL #2]
    (3)从存储器地址[R6]中取1字节数值,送入R5中,并将R6更新为R6+0x22;
    LDRB R5, [R6]
    ADD R6, R6, #0x22
    (4)将PC+6指向的存储器的字数据送入R1中。
    LDR R1, [PC, #6]

  6. 采用两种指令编写实现将寄存器R2、R4、R5、R6、R8内容进栈保存。
    使用STMFD指令将寄存器R2、R4、R5、R6、R8内容进栈保存
    STMFD SP!, {R2, R4, R5, R6, R8}
    使用PUSH指令将寄存器R2、R4、R5、R6、R8内容进栈保存
    PUSH {R2, R4, R5, R6, R8}

  7. 分别使用条件跳转指令和IT指令编写程序段实现以下功能:比较寄存器 RO与R1,相等时,RO逻辑右移2位,R1循环右移2位;不等时,R0算术右移2位,R1带进位循环右移 2位。

  8. 编写程序段不使用乘法指令实现将寄存器R6的内容乘以9,并将其结果存入寄存器 R7内