本地资料指令集种类
SCHEDULE LOCAL11 个小节覆盖真题 20092025
关联考点复杂和精简指令集3指令体系结构3做相关真题 · 6 道 →
做相关真题 · 6 道选中文字可高亮或加下划线
选中文字高亮 · 下划线

指令集种类

指令体系结构

复习提示(低优先级):掌握 ISA 的可见内容,以及 CISC 与 RISC 的典型设计取舍。

真题练习

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

指令体系结构 (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)是两种不同的计算机体系结构设计哲学,它们在 指令集架构执行方式 上有显著的差异。

CISC 与 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 系列处理器。


CISC 单条复杂访存指令与 RISC 多条加载运算存储指令的对比

上图体现了 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):

for (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
20 ... ...
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 的主要区别如下表所示:

特性 CISC RISC
指令集 复杂,指令数量多 精简,指令数量少
指令长度 通常不定长 通常固定长度
寻址模式 多种寻址模式 较少寻址模式
控制方式 常采用微程序控制 常采用硬布线控制
硬件复杂度 译码与控制较复杂 译码与控制较精简
优点 一条指令可完成较复杂操作,代码密度较高 易于流水化,控制路径规则
缺点 指令解码与执行时延差异较大 复杂操作通常需要多条指令完成

上述是典型设计倾向,不是绝对规则;现代处理器可能同时吸收两类思想。

不同位数指令

x86 中 16 位、32 位与 64 位寄存器名称和宽度的继承关系

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

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

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

寄存器语义 16 位 32 位 64 位 类型
Accumulator AX EAX RAX General
Base BX EBX RBX General
Counter CX ECX RCX General
Data DX EDX RDX General
Source Index SI ESI RSI Pointer
Destination Index DI EDI RDI Pointer
Base Pointer BP EBP RBP Pointer
Stack Pointer SP ESP RSP Pointer
Instruction Pointer IP EIP RIP Pointer
Code Segment CS Segment
Data Segment DS 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...
内存寻址 [] ()

ISA 边界、位数与汇编语法的读法

指令集体系结构(ISA)规定的是软件可见的契约:有哪些指令、寄存器和数据类型,指令的效果、异常以及寻址规则如何定义。流水线级数、是否采用微程序、Cache 容量和执行单元数量属于具体实现或微体系结构;不同 CPU 可以实现同一 ISA,却有不同的性能和内部结构。做题时若问“程序员可见”,优先从 ISA 角度判断,不能把某款处理器的内部结构当成所有实现的必然要求。

CISC 与 RISC 描述的是常见设计倾向,不是每条指令的硬性好坏标签。CISC 通常提供较多、长度可变且功能较复杂的指令与寻址方式;RISC 常采用较规则的指令格式、更多通用寄存器和 load/store 风格,便于译码和流水化。现代实现可能把复杂 ISA 指令在内部拆成更简单的微操作,也可能给精简 ISA 配置很复杂的乱序执行硬件;这不改变软件层看到的 ISA 语义。

“多少位计算机”在不同语境中可能指通用寄存器或数据通路的自然字长,不应自动等同于地址宽度、指令长度、数据总线宽度或操作系统中指针的每一个位数。若地址字段宽度为 aa,按字节编址且无其他限制时最多能表示 2a2^a 个字节地址;若指令字长为 ww,则操作码、寄存器号、寻址方式和立即数等字段共同争用这 ww 位。

汇编阅读也要先固定语法。Intel 格式常写成“目的,源”,AT&T 常写成“源,目的”;AT&T 中寄存器前的百分号和立即数前的美元符号是语法标记,而括号表示以寄存器内容为地址访问内存。两种写法表达的操作数数据流可完全相同,不能只因左右位置不同就误判是相反的运算。