• 指令系统的发展与性能要求

    • 指令系统的发展
      早期计算机指令非常简单(如单地址、零地址指令)。随着硬件发展和应用需求,指令系统从基本算术逻辑扩展至浮点运算、字符串处理、多媒体(SIMD指令)、加密等。出现了复杂指令集计算机(CISC)和精简指令集计算机(RISC)两种设计哲学。CISC(如x86)指令丰富,便于编程但实现复杂;RISC(如ARM、MIPS)指令精简、规整,易于流水线和高频实现。
    • 指令系统的性能要求
      指令系统应满足:完整性(覆盖所有必要操作)、规整性(指令格式简单,寻址方式一致)、高效性(常用指令执行快)、兼容性(软件向前兼容)、可扩展性(便于增加新指令)。此外,还需要支持高级语言、操作系统和并发编程。
    • 低级语言与硬件结构的关系
      机器语言(二进制)和汇编语言(助记符)直接对应机器指令,与硬件结构(寄存器、ALU、总线等)紧密相关。程序员通过低级语言可以直接控制硬件资源,但编程效率低。高级语言通过编译或解释转换为目标机器指令,抽象层次更高。
  • 指令格式

    • 操作码
      操作码(Opcode)指定指令要执行的操作(如ADD、MOV)。操作码长度可以是定长(便于译码,如RISC通常32位固定长度)或变长(如x86,1-15字节,节省空间但译码复杂)。操作码设计常采用扩展操作码技术,通过预留码点扩展指令数量。
    • 地址码
      地址码字段指明操作数的来源和结果的去向。根据地址码数量,指令可分为三地址、二地址、一地址、零地址(如堆栈机)。例如:ADD R1, R2, R3 (R1←R2+R3)为三地址;ADD R1, R2 (R1←R1+R2)为二地址;ADD R1 (ACC←ACC+R1)为一地址。
    • 指令字长度
      指令字长度可以是定长(如ARM的32位)或变长(如x86的1-15字节)。定长指令便于取指和译码,适合流水线;变长指令代码密度高,节省内存。现代处理器常采用混合方式:主流RISC为定长32位,CISC使用变长,但在内部转换为类似RISC的微操作。
    • 指令助记符
      助记符(Mnemonic)是汇编语言中表示操作码的英文缩写,如ADD、SUB、MOV、JMP。便于记忆和编写。操作数通常使用寄存器符号(如EAX)或立即数、内存地址表达式。
    • 指令格式举例
      • ARM 32位指令:例如 ADD r0, r1, r2(机器码:E0810002,其中[31:28]条件码,[27:25]为00,[24:21]操作为0100,[20]为S位等)。
      • x86指令:变长,例如 89 C8 表示 MOV eax, ecx
  • 操作数类型

    • 一般的数据类型
      常见操作数类型:整数(字节、半字、字、双字)、浮点数(单精度/双精度)、字符(ASCII/Unicode)、逻辑数(布尔值)、指针(地址)。
    • Pentium数据类型
      英特尔x86支持:字节(8位)、字(16位)、双字(32位)、四字(64位)、双四字(128位,用于SSE)、10字节扩展浮点数(80位)。也支持BCD(二进制编码十进制)和打包的SIMD数据。
    • Power PC数据类型
      PowerPC(RISC)支持:字节、半字(16位)、字(32位)、双字(64位)。浮点类型为单精度和双精度。支持对齐访问。
  • 指令和数据的寻址方式

    • 指令的寻址方式
      指令的寻址即确定下一条指令的地址。顺序执行时,指令地址由程序计数器(PC)自动递增;跳转指令通过偏移量(相对寻址)或绝对地址改变PC值。
    • 操作数基本寻址方式
      常见寻址方式:
      • 立即寻址:操作数直接包含在指令中(如 ADD R1, #5)。
      • 寄存器寻址:操作数存放在寄存器中(如 ADD R1, R2)。
      • 直接寻址:指令给出内存地址(如 ADD R1, [1000])。
      • 间接寻址:指令给出存放地址的寄存器或内存单元(如 ADD R1, [R2])。
      • 变址寻址:基址寄存器+偏移量(如 ADD R1, [R2 + 10]),适于数组访问。
      • 相对寻址:PC+偏移量,用于转移指令。
      • 基址寻址:基址寄存器+偏移量,常用于重定位。
      • 堆栈寻址:隐含使用堆栈指针(SP)访问栈顶。
    • 寻址方式举例
      以ARM为例:LDR R1, [R2, #8](变址)、LDR R1, [R2, R3](寄存器偏移)、LDR R1, label(PC相对寻址)。x86的 MOV eax, [ebx+ecx*4+8] 复杂变址。
  • 典型指令

    • 指令的分类
      指令通常分为:
      • 数据传送指令(MOV,LOAD,STORE)
      • 算术运算指令(ADD,SUB,MUL,DIV)
      • 逻辑运算指令(AND,OR,XOR,NOT,移位)
      • 控制转移指令(JMP,BCC(条件分支),CALL,RET)
      • 输入输出指令(IN,OUT)
      • 系统控制指令(NOP,HLT,特权指令)
      • 浮点指令(FADD,FMUL等)
      • SIMD指令(MMX,SSE,AVX,NEON)
    • 基本指令系统的操作
      基本指令包括:算术/逻辑、存储器读写、分支、子程序调用/返回、堆栈操作等。例如,一个简单RISC指令集通常包含20-40种指令。
    • RISC指令系统
      RISC(精简指令集计算机)的特点:
      • 指令数量少,每条指令功能简单,执行时间固定(通常单周期)。
      • 指令长度固定,格式规整。
      • 只有LOAD/STORE指令访问内存,其他指令操作数均来自寄存器。
      • 大量通用寄存器(32个或更多)。
      • 硬件实现简单,利于流水线和超标量。 典型RISC:ARM、MIPS、RISC-V。
  • ARM汇编语言
    ARM汇编语言基于ARM指令集(32位/64位)。常见指令:MOV(传送)、ADD/SUB(加减)、LDR/STR(内存读写)、B/BL(分支/带返回分支)、CMP(比较)、条件执行(如ADDEQ)。寄存器:R0-R12通用,R13(SP),R14(LR),R15(PC)。示例程序:

    1
    2
    3
    4
    5
    6
    
        AREA Example, CODE, READONLY
        ENTRY
        MOV R0, #5
        MOV R1, #3
        ADD R2, R0, R1   ; R2 = 8
        END
    

4