计算机指令编码与内存架构详解
1. 指令的替代编码
早期,英特尔设计 80x86 时,一个主要目标是创建能让程序员编写短程序的指令集,以节省当时宝贵的内存。为此,英特尔为一些常用指令设计了替代编码,这些替代指令比标准指令更短,英特尔期望程序员广泛使用,从而编写更短的程序。
以 add(constant, accumulator)
指令为例,其中累加器可以是 al
、 ax
或 eax
。80x86 为 add(constant, al)
和 add(constant, eax)
提供了 1 字节的操作码,分别是 $04
和 $05
。由于操作码为 1 字节且无 mod-reg-r/m
字节,这些指令比标准的立即数加法指令短 1 字节。 add(constant, ax)
指令需要操作数大小前缀,其操作码实际为 2 字节,但仍比对应的标准立即数加法指令短 1 字节。
使用这些指令时,无需特殊指定。优秀的汇编器或编译器在将源代码转换为机器码时,会自动选择最短的指令。不过,英特尔仅为累加器寄存器提供了替代编码。所以,当有多个指令可供选择且累加器寄存器在其中时, AL
、 AX
和 EAX
寄存器通常是最佳选择,但这通常仅适用于汇编语言程序员。