计算机指令集结构
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 立即值寻址方式是算数运算、分支比较等指令中最常见的寻址方式,所以要确定有多少指令使用立即数。 * 立即数的大小会影响字长,所以要分析立即数的大小分布 * * * * * * * * * * * * * * * * * * * * * * * 2.5 指令格式的设计 混合型编码格式 提供若干种固定的指令字长。 以期达到既能够减少目标代码长度又能降低译码复杂度的目标。 * * 2.6 MIPS指令集结构 32个64位通用寄存器(GPRs) R0,R1,…,R31 也被称为整数寄存器 R0的值永远是0 32个64位浮点数寄存器(FPRs) F0,F1,…,F31 介绍MIPS64的一个子集,简称为MIPS。 2.6.1 MIPS的寄存器 * * 2.6 MIPS指令集结构 用来存放32个单精度浮点数(32位),也可以用来存放32个双精度浮点数(64位)。 存储单精度浮点数(32位)时,只用到FPR的一半,其另一半没用。 一些特殊寄存器 它们可以与通用寄存器交换数据。 例如,浮点状态寄存器用来保存有关浮点操作结果的信息。 * * 2.6.2 MIPS的数据表示 MIPS的数据表示 整数 字节(8位) 半字(16位) 字(32位) 双字(64位) 浮点数 单精度浮点数(32位) 双精度浮点数(64位) 字节、半字或者字在装入64位寄存器时,用零扩展或者用符号位扩展来填充该寄存器的剩余部分。装入以后,对它们将按照64位整数的方式进行运算。 * * 2.6.3 MIPS的数据寻址方式 立即数寻址与偏移量寻址 立即数字段和偏移量字段都是16位的。 寄存器间接寻址是通过把0作为偏移量来实现的 16位绝对寻址是通过把R0(其值永远为0)作为基址寄存器来完成的 MIPS的存储器是按字节寻址的,地址为64位 所有存储器访问都必须是边界对齐的 * * 2.6.4 MIPS的指令格式 寻址方式编码到操作码中 所有的指令都是32位的 操作码占6位 3种指令格式 * * 2.6.4 MIPS的指令格式 I类指令 包括所有的load和store指令、立即数指令、,分支指令、寄存器跳转指令、寄存器链接跳转指令。 立即数字段为16位,用于提供立即数或偏移量。 * * 2.6.4 MIPS的指令格式 load指令 访存有效地址:Regs[rs]+immediate 从存储器取来的数据放入寄存器rt store指令 访存有效地址:Regs[rs]+immediate 要存入存储器的数据放在寄存器rt中 立即数指令 Regs[rt] ← Regs[rs] op immediate 分支指令 转移目标地址:Regs[rs]+immediate,rt无用 寄存器跳转、寄存器跳转并链接 转移目标地址为Regs[rs] * * 2.6.4 MIPS的指令格式 R类指令 包括ALU指令、专用寄存器读/写指令、move指令等。 ALU指令 Regs[rd]← Regs[rs] funct Regs[rt] func为具体的运算操作编码 * * 2.6.4 MIPS的指令格式 J类指令 包括跳转指令、跳转并链接指令、自陷指令、异常返回指令。 在这类指令中,指令字的低26位是偏移量,它与PC值相加形成跳转的地址。 * * 2.6.5 MIPS的操作 MIPS指令可以分为四大类 load和store ALU操作 分支与跳转 浮点操作 符号的意义 x←ny:从y传送n位到x x,y←z:把z传送到x和y * * 2.6.5 MIPS的操作 下标:表示字段中具体的位; 对于指令和数据,按从最高位到最低位(即从左到右)的顺序依次进行编号,最高位为第0位,次高位为第1位,依此类推。 下标可以是一个数字,也可以是一个范围。 例如:Regs[R4]0:寄存器R4的符号位 Regs[R4]56..63:R4的最低字节 Mem:表示主存; 按字节寻址,可以传输任意个字节。 上标:用于表示对字段进行复制的次数。 例如:0 32:一个32位长的全0字段 * * 2.6.5 MIPS的操作 符号##:用于两个字段的拼接,并且可以出现在数据传送的任何一边。 举例:R8、R10:64位的寄存器,则 Regs[R8]32..63 ←32 (Mem [Regs[R6]]0)24 ## Mem [Regs[R6]] 表示