指令集种类

指令系统

指令体系结构

💡 低优先级

指令体系结构 偶尔在选择题中考查,概念看一看,留个印象,基本就没问题。

指令体系结构 (Instruction Set Architecture,简称 ISA) 是计算机体系结构中定义处理器 指令集 的规范。它是硬件与软件之间的接口,规定了处理器能够执行的 指令集合指令格式寻址方式寄存器 组织、内存访问方式 以及 数据类型 等。

具体来说,ISA 包括以下关键内容:

  1. 指令集 :处理器支持的所有操作(如加法、跳转、加载/存储等)。
  2. 指令格式 :每条指令的编码结构,如操作码、操作数等。
  3. 寄存器 :可用的寄存器数量、类型和用途(如通用寄存器、程序计数器等)。
  4. 寻址方式 :如何指定操作数的存储位置(如立即数、寄存器寻址、内存寻址等)。
  5. 内存模型 :内存的组织方式和访问规则。
  6. 中断和异常处理 :如何处理外部事件或错误。

ISA 决定了软件如何与硬件交互,是 编译器操作系统应用程序 开发的基础。常见的 ISA 包括 x86ARMRISC‑V 等,每种 ISA 在 性能功耗应用场景 上各有特点。例如,RISC (精简指令集计算机)强调 简单高效 的指令,而 CISC (复杂指令集计算机)提供更 复杂 的指令以减少代码量。

简而言之,ISA 是计算机的核心“语言”,定义了处理器能做什么以及如何做。

复杂和精简指令集

💡 低优先级

复杂和精简指令集也是在选择题偶尔考查,了解两者的差异,看到选项能选出来就行。

CISC (Complex Instruction Set Computer)和 RISC (Reduced Instruction Set Computer)是两种不同的计算机体系结构设计哲学,它们在 指令集架构执行方式 上有显著的差异。

csic 和 risc 处理器

CISC

  1. 指令集复杂 :CISC 指令集包含大量 复杂的指令 ,其中一条指令可以执行多种操作,包括 内存访问算术运算逻辑运算 等。
  2. 指令不定长 :CISC 支持多种长度的指令。
  3. 多寻址模式 :CISC 指令通常支持多种 寻址模式 ,允许直接访问内存,因此可以在一条指令中执行复杂的操作。
  4. 微程序控制 :CISC 计算机通常使用 微程序控制单元 ,指令解码和执行过程相对复杂。
  5. 复杂硬件 :CISC 处理器通常包括大量的硬件单元,用于支持 复杂的指令集 ,这使得 CISC 芯片相对较大。

CISC 的典型芯片就是 x86 系列,如 Intel 的 Core i 系列处理器和 AMD 的 Ryzen 系列处理器。

RISC

  1. 指令集精简 :RISC 计算机的指令集更加精简,通常包含较少、更 简单的指令 。每条指令只执行一种操作。
  2. 指令定长 :RISC 指令集中所有指令长度相同。
  3. 固定寻址模式 :RISC 指令通常只支持一种或者很少种 寻址模式 ,鼓励将数据加载到寄存器中后再执行操作。
  4. 硬布线控制 :RISC 计算机使用 硬布线控制单元 ,指令解码和执行过程较为简单。
  5. 精简硬件 :RISC 处理器通常采用更 精简的硬件 ,以提高 性能 和降低 成本

RISC 的典型芯片就是 arm 系列,比如苹果的 A 系列和 M 系列处理器。

上图 体现了 CISCRISC 的差别:RISC 寄存器数量比 CISC 更多,CISC 的访存指令比 RISC 更加复杂(CISC 单条指令完成的工作 RISC 需要多条指令才能完成)。

程序示例

这一节举个实际的例子说明一下 CISCRISC 上的汇编代码区别。

for (i = 0; i < 24; i++)
    for (j = 0; j < 24; j++)
        ...
        a[i][j] = 10;
        ...

对于上述的循环代码段,编译器将其编译为如下的 intel x86 汇编代码(CISC )和 arm mips 汇编代码(RISC ):

or (i = 0; i < 24; i++)
1  00401072  C7 45 F8 00 00 00 00      mov     dword ptr [ebp-8], 0   ; i = 0,初始化 i 变量
2  00401079  EB 09                     jmp     00401084h              ; 跳转到循环条件检查
3  0040107B  8B 55 F8                  mov     eax, [ebp-8]           ; 读取 i 的值到 eax
    ... ... ...
7  00401088  7D 32                     jge     004010BCh              ;  i >= 24,跳出循环

    for (j = 0; j < 64; j++)
8  0040108A  C7 45 FC 00 00 00 00      mov     dword ptr [ebp-4], 0   ; j = 0,初始化 j 变量
        ... ... ...
        a[i][j] = 10;
        ... ... ...
19 004010AE  C7 84 82 00 20 42 00 0A 00 00 00
                                       mov     dword ptr [ecx+edx*4+00422000h], 0Ah
                                                                      ; 存储 10  a[i][j],计算地址:
                                                                      ; ecx = i, edx = j
                                                                      ; a[i][j] = 10
                                                              
for (i = 0; i < 24; i++)
1  00401000  20020000      addi  $v0, $zero, 0       # i = 0
2  00401004  08004004      j     0x00401010          # 跳转到循环条件检查
3  00401008  8C430008      lw    $v1, 8($fp)         # 读取 i
    ... ... ...
7  00401010  1C600018      bge   $v1, 24, 0x00401040 # if (i >= 24) 跳出循环
    for (j = 0; j < 64; j++)
8  00401014  20040000      addi  $a0, $zero, 0       # j = 0
        ... ... ...
        a[i][j] = 10;
17 00401028  00031880      sll   $v1, $v1, 6         # i × 64
18 0040102C  00641820      add   $v1, $v1, $a0       # i × 64 + j
19 00401030  00031880      sll   $v1, $v1, 2         # (i × 64 + j) × 4
20 00401034  3C010042      lui   $at, 0x0042         # 加载基地址高 16 
21 00401038  34222000      ori   $v0, $at, 0x2000    # 完整基地址 0x00422000
22 0040103C  00621020      add   $v0, $v1, $v0       # 计算目标地址
23 00401040  2405000A      li    $a1, 10             # 10 存入 $a1
24 00401044  AC450000      sw    $a1, 0($v0)         # a[i][j] = 10
25 ... ...

对比

CISCRISC 的主要区别如下表所示:

特性CISCRISC
指令集复杂,指令数量多精简,指令数量少
指令长度不定长固定长度
寻址模式多种寻址模式较少寻址模式
控制方式微程序控制硬布线控制
硬件复杂度复杂精简
优点功能强大,一条指令可完成复杂操作性能高,功耗低
缺点硬件复杂,指令执行效率相对较低功能相对简单,复杂操作需要多条指令完成

不同位数指令

8086 (16 位 intel 处理器)再到后来的 32 位 以及 64 位 的 CPU,差异主要体现在以下几个方面:

  1. 寄存器位数命名 不同:32 位寄存器有 E 前缀,64 位寄存器有 R 前缀。
  2. 指令集 不同:32 位处理器相比 16 位处理器有着更加复杂的指令集,64 位处理器的指令集也比 32 位更加复杂。

下表中给出了不同位数寄存器的对比,注意每个寄存器的开头都与一个 单次 相对应,在最初 8086 的设计中这是代表一种语义。

寄存器16 位32 位64 位类型
CounterCXECXRCXGeneral
DataDXEDXRDXGeneral
Source IndexSIESIRSIPointer
Destination IndexDIEDIRDIPointer
Base PointerBPEBPRBPPointer
Stack PointerSPESPRSPPointer
Instruction PointerIPEIPRIPPointer
Code SegmentCS--Segment
Data SegmentDS--Segment

AT&T 和 Intel 指令

x86 汇编指令集中,常有 AT &TIntel 两种格式,两种格式有较大差异。在考试中主要考察的是 Intel 格式,但是 AT &T 也需稍作了解,在遇到指令时能辨认出即可。

Intel 格式

mov eax,1 mov ebx,0ffh mov eax,[ebx] mov eax,[ebx+3]

AT&T 格式

movl $1,%eax movl $0xff,%ebx movl (%ebx),%eax movl 3(%ebx),%eax

两种指令格式的不同主要在于 Intel 格式的 目的操作数 在左,源操作数 在右,而 AT &T 格式 目的操作数 在右,源操作数 在左。

两种指令格式的具体表格如下表所示:

特性Intel 格式AT &T 格式
操作数顺序目的,源源,目的
寄存器eax, ebx...%eax, %ebx...
常数10, 0x20...$10, $0x20...
内存寻址[]()

相关笔记

  • Cache
  • 外存
  • 存储系统
  • 存储系统概述
  • 内存
  • 虚拟存储器