日新计划6月更文 Day 24
我们知道,不同企业和组织设计了不同的指令集(Instruction Set),用于不同类型的CPU,如 Intel 的x86、IA64;IBM 的 PowerPC;AMD 的 amd64 ;RISC-V等。评价一个指令集的优劣需要看它是否便于硬件设计、是否便于编译器实现、性能、功耗与成本等因素。
一个指令系统应满足完备性、规整性、有效性、兼容性和可扩展性:
- 完备性:指令丰富、功能齐全
- 规整性:包括对称性(支持不同寻址方式)和匀齐性(支持不同数据类型)
- 有效性:基于该指令集的程序可以使用
- 兼容性:对新版的指令集或主机向上兼容
表示一条指令的机器字,称为指令字,简称指令。一条指令需要具备操作码、寻址方式和地址码:
- 操作码:Operation Code(OP),指出要进行的操作,即指令编号
- 地址码:Address Code(AC),与寻址方式共同给出操作数
- 寻址方式:Mode,如何解析地址码,可包含在地址码字段,也可隐含在操作码字段
指令中包含二进制数的位数称为指令字长度,根据指令字长度是否固定,指令可分为定长指令与变长指令:定长指令结构简单,如 MIPS 指令;变长指令灵活,如 x86 指令。
寻找指令或操作数有效地址的过程成为“寻址”,根据寻找的对象分为指令寻址和操作数寻址:
程序对应的机器指令序列在主存顺序存放,执行时从第一条指令开始执行,同时使用程序计数器(Program Counter,PC)记录正在执行的指令,默认情况下执行完成后 PC++,执行下一条指令,这就是指令的顺序寻址。
对于循环、分支判断等情况,则是由指令给出下一条指令的地址,直接重写 PC,达到跳跃寻址的目的。
操作数寻址则较为复杂,若实际有效地址为 EA, 实际操作数 S,则 S = (EA)。操作数寻址有以下几种情况:
-
立即寻址:地址码字段是操作数本身,S = D
-
寄存器寻址:操作数在CPU的内部寄存器中,EA = R
-
直接寻址:地址码字段直接给出操作数在内存的地址,EA = D,S = (D)
-
间接寻址: D单元的内容是操作数地址, D是操作数地址的地址, EA = (D),S = ((D))
有指针内味了啊
-
寄存器间接寻址:D单元的内容是操作数的地址,D是操作数地址的地址,EA = (R),S = ((R))
-
相对寻址:指令中的D加上PC的内容作为操作数的地址,EA = (PC) + D
-
基址寻址/变址寻址:操作数地址为基址/变址寄存器+偏移量,EA = (R) + D