是什么

  • 定义下一条指令地址由当前指令首地址加上自身长度决定;相对寻址以 CPU 取指后自动更新的 PC 为基准计算目标;多维数组行优先存储是将高维逻辑结构映射为一维连续物理字节序列。

  • 大白话:指令按字节挨着放,读完当前这条,PC 就自动跳到紧挨着的下一条开头;二维数组就是一行排完接着排下一行,找元素是“先跳过整行字节,再跳过列内字节”。

核心内容

1. 指令地址推导与 PC 相对寻址

下一条指令虚拟地址计算公式

CPU 在顺序执行时,按字节编址下的下一条指令首地址公式为:

转移指令与相对寻址目标地址计算

  • 为什么转移指令后紧跟的是偏移量

    在 x86 等指令集架构中,跳转指令(如 jmp 的操作码 EBjge 的操作码 7D)在硬件格式上设计为:操作码 + 相对偏移量。因此指令中剥离出操作码后,剩下的部分必然是相对位移量。

  • 基准 PC 的物理意义

    CPU 执行指令分为“取指”和“执行”。在“取指”阶段结束时,硬件已经自动完成了 。因此在“执行”阶段计算转移目标时:

2. 汇编操作数与寻址方式判别

以典型汇编指令 mov [ecx + edx*4 + 00422000h], 0Ah 为例:

Plaintext

mov      [ecx + edx*4 + 00422000h]   ,    0Ah
 ↑                  ↑                      ↑
操作码          目的操作数 (左)          源操作数 (右)
  • 目的操作数:带方括号 [...],表示访问内存。采用 基址 + 比例变址 + 偏移量寻址

  • 源操作数0Ah 是直接硬编码在指令中的常数(立即写入的值),采用 立即(数)寻址

注意:机器指令就是机器码



3. 二维数组 a[M][N] 物理地址映射机制

设二维数组定义为 type a[M][N],首地址为 ,每个元素占 字节(如 int):

  • (总行数):仅代表数组在第一维的最大容量/循环上限,绝对不参与任何元素的物理地址计算

  • (每行的列数):决定了一整行有多少个元素,每行占用的物理空间大小为 字节。

元素 a[i][j] 地址计算拆解

Plaintext

起始地址 ───────────────────────────────┐
                                        ▼
第 0 行:  [ (0,0) (0,1) ... (0,N-1) ] ── 占 N × L 字节
第 1 行:  [ (1,0) (1,1) ... (1,N-1) ] ── 占 N × L 字节
...
第 i-1 行:[ ...                     ] ── 占 N × L 字节
                                        ▼ (前面共跨越了 i 个整行)
第 i 行:  [ (i,0) (i,1) ... (i,j) ... ] ── 定位到第 j 个元素 (跨越了 j 个元素)
  • 行偏移字节数(跨越前 行)

    对于 a[24][64]int 类型):

  • 列偏移字节数(定位当前行内的第 个元素)

  • 最终物理地址公式

例题

  • 题目

    已知计算机 M 的字长为 32 位,按字节编址,虚拟地址为 32 位,页大小为 4KB。数组 a 定义为 int a[24][64],部分机器级代码如下:

    代码段

    ; 行号   虚拟地址     机器指令                      汇编指令
    1       00401072    C7 45 F8 00 00 00 00          mov dword ptr [ebp-8], 0
    2       00401079    EB 09                         jmp 00401084h
    ...
    19      004010AE    C7 84 82 00 20 42 00 0A 00 00 00  mov dword ptr [ecx+edx*4+00422000h], 0Ah
    20      ...
    
    1. 第 20 条指令的虚拟地址是多少?

    2. 已知第 2 条 jmp 指令操作码为 EBH,转移目标地址为 00401084H,该指令采用什么寻址方式?给出第 2 条指令 jmp 的转移目标地址计算过程。

    3. 已知第 19 条 mov 指令的功能为 a[i][j] = 10,其中 00422000H 是数组 a 的首地址。指令中源操作数采用什么寻址方式?已知 edx 中存放的是变量 jecx 中存放的是什么?根据该指令机器码判断 M 采用的是大端还是小端方式。

  • 分析

    1. 第 19 条指令从 004010AEH 开始,机器码共 11 字节,相加得第 20 条指令地址。

    2. EB 为相对跳转,后续 09 为偏移量。基准 PC 为第 2 条指令下一条地址 0040107BH,加偏移量即得目标地址。

    3. 源操作数为右侧常数 0Ah(立即寻址)。根据二维数组行优先展开,ecx 对应第 行跨越的字节总数()。立即数 0Ah (即0000 000A)在机器码中为 0A 00 00 00,低字节在低地址,为小端。

  • 答案

    1)

    第 19 条指令占 11 个字节,起始地址为 004010AEH

    2)

    • 寻址方式相对寻址

    • 目标地址计算过程

      第 2 条指令占用 2 个字节,下一条指令(基准 PC)地址为:

      指令中的偏移量为

    3)

    • 源操作数寻址方式立即(数)寻址

    • ecx 中存放的内容(或 行相对于数组首地址的字节偏移量 / )。

    • 大小端判断

      立即数 0Ah(32 位数值为 0000000AH)在机器码中的顺序为 0A 00 00 00,低位有效字节 0AH 存放在低地址端,因此 M 采用小端方式

⚠️ 易错点

Warning

  • 二维数组地址计算混淆总行数与列数 → 定义 a[24][64] 中,总行数 24 不参与寻址计算;行偏移乘的是每行的列数(64)元素字节宽度(4)

  • 源操作数与目的操作数搞反 → 在 mov DST, SRC 中,左侧为目的操作数(写入的目标),右侧为源操作数(读取的数据)。

  • 计算下一条指令漏算十六进制进位 → 十六进制运算逢 16 进 1,如 ,不要直接当成十进制做加法。