指令系统的发展与性能要求
指令系统的发展
早期计算机指令非常简单(如单地址、零地址指令)。随着硬件发展和应用需求,指令系统从基本算术逻辑扩展至浮点运算、字符串处理、多媒体(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] 复杂变址。 典型指令
...