1.3.1 指令集体系结构:计算机体系结构的近距离审视(1)
我们在本书中用指令集体系结构(ISA)一词来指代程序员可以看到的实际指令集。ISA的作用相当于区分软件和硬件的界限。在下面对ISA的快速回顾中,将使用80x86、ARM和MIPS的例子从7个方面来介绍ISA。附录A和附录K更详细地介绍了这3种ISA。
(1) ISA分类。现今几乎所有的ISA都划分到通用寄存器体系结构中,在这种体系结构中,操作数或者是寄存器,或者是存储器地址。80x86有16个通用寄存器和16个通常存入浮点数据的寄存器,而MIPS则有32个通用寄存器和32个浮点寄存器(见表1-3)。这一类别有两种主流版本,一种是寄存器-存储器ISA,比如80x86,可以在许多指令中访问存储器;另一种是载入-存储ISA,比如ARM和MIPS,它们只能用载入或存储指令来访问存储器。所有最新ISA都采用载入-存储版本。
表1-3 MIPS寄存器和使用规范
名称
编号
用途
在调用之间
是否保留
$zero
0
常量值0
不可用
$at
1
为汇编程序保
存的临时寄存器
否
$v0–$v1
2~3
函数返回值和表达
式计算结果的值
否
$a0–$a3
4~7
实参
否
$t0–$t7
8~15
临时变量
否
$s0–$s7
16~23
已保存的临时变量
是
$t8–$t9
24~25
临时变量
否
$k0–$k1
26~27
为操作系统内核保留
否
$gp
28
全局指针
是
$sp
29
栈指针
是
$fp
30
帧指针
是
$ra
31
返回地址
是
* 除了32个通用寄存器(R0-R31)之外,MIPS还有32个浮点寄存器(F0-F31),可以保存一个32位单精度数或一个64位双精度数。
(2) 存储器寻址。几乎所有桌面计算机和服务器计算机(包括80x86、ARM和MIPS)都使用字节寻址来访问存储器操作数。有些体系结构(像ARM和MIPS)要求操作对象必须是对齐的。一个大小为s的对象,其字节地址为A,如果A mod s=0,则对这个对象的访问是对齐的。80x86(见附录图A-2)不需要对齐,但如果操作数是对齐的,访问速度通常会更快一些。
(3) 寻址模式。除了指定寄存器和常量操作数之外,寻址模式还指定了一个存储器对象的地址。MIPS寻址模式为:寄存器(寻址)、立即数(寻址)和位移量(寻址)。立即数寻址用于常数寻址,在位移量寻址模式中,将一个固定偏移量加到寄存器,得出存储器地址。80x86支持上述3种模式,再加上位移量的3种变化形式,即:无寄存器(绝对数)、两个寄存器(用位移量进行基址寻址)、两个寄存器,其中一个寄存器的内容乘以操作数的字节大小--用比例索引和位移量进行变址寻址。它与上述3种寻址方式类似,只是要减去位移量字段,加上寄存器间接寻址、基址寻址和变址寻址。ARM拥有3种MIPS寻址模式再加上相对PC(程序计数器)的寻址方式、两个寄存器之和,还有一种方式也是两个寄存器之和,但其中一个寄存器的内容要乘以操作数的字节大小。它还有自动递增寻址和自动递减寻址:计算得到的地址会被放在用于构造该地址的一个寄存器中,替代其中的内容。
(4) 操作数的类型和大小。和大多数ISA类似,80x86、ARM和MIPS支持的操作数大小为8位(ASCII字符)、16位(Unicode字符或半个字)、32位(整数或字)、64位(双字或长整型)以及IEEE 754浮点数,包括32位(单精度)和64位(双精度)。80x86还支持80位浮点(扩展双精度)。
(5) 操作指令。常见的操作类别为:数据传输指令、算术逻辑指令、控制指令(下面进行讨论)和浮点指令。MIPS是一种简单的、易于实现流水化的指令集体系结构,它是2011年采用RISC体系结构的代表。表1-4总结了MIPS ISA。80x86的操作指令集要丰富得多,大得多(参见附录K)。
表1-4 MIPS64中的部分指令
指令类型/操作码
指令含义
数据传输
在寄存器和存储器之间,或者在整数和
FP或特殊寄存器之间移动数据;唯一
的存储器寻址模式是16位位移量加上GPR的内容
LB、LBU、SB
载入字节、载入无符号字节、存储字节
(至/自整数寄存器)
LH、LHU、SH
载入半字、载入无符号半字、存储半字
(至/自整数寄存器)
LW、LWU、SW
载入字、载入无符号字、
存储字(至/自整数寄存器)
LD、SD
载入双字、存储双字(至/自整数寄存器)
L.S、L.D、S.S、S.D
载入SP浮点、载入DP浮点、
存储SP浮点、存储DP浮点
MFCO、MTCO
在GPR与特殊寄存器之间复制数据
MOV.S、MOV.D
将一个SP或DP FP寄存器复制到
另一个FP寄存器
MFC1、MTC1
在FP寄存器与整数寄存器之间复制32位
算术/逻辑
对GPR中的整数或逻辑数据进行操作;
带符号算术运算溢出时进行陷阱捕获
DADD、DADDI、DADDU、DADDIU
加,加立即数(所有立即数为16位);
有符号和无符号
DSUB、DSUBU
减,有符号和无符号
DMUL、DMULU、DDIV、
DDIVU、MADD
乘和除,有符号和无符号;乘-加;
所有运算的操作数和结果都是64位数值
AND、ANDI
与,和立即数相与
OR、ORI、XOR、XORI
或,和立即数求或,异或,和立即数求异或
LUI
载入高位立即数;将立即数载入到寄
存器的32~47位,然后进行符号扩展
DSLL、DSRL、DSRA、
DSLLV、DSRLV、DSRAV
移位:立即数形式(DS__)和变量
形式(DS__V);移位为左逻辑移位、
右逻辑移位、右算术移位
SLT、SLTI、SLTU、SLTIU
若小于操作数则置位、若小于立即数
则置位、有符号和无符号
控制
控制分支和跳转,相对于PC寄存器
或通过寄存器控制
BEQZ、BNEZ
GPR等于/不等于0时转移、相对于
PC+4偏移16位偏移量
BEQ、BNE
GPR相等/不相等时转移、相对于
PC+4转移16位偏移量
BC1T、BC1F
测试FP状态寄存器中的对比位,并
转移;相对于PC+4转移16位偏移量
MOVN、MOVZ
如果第三个GPR为负数/零,则将第一
个GPR复制到第二个GPR
J、JR
跳转至与PC+4偏移26位偏移量的位置
(J)、跳转至寄存器中的目标位置(JR)
(续)
指令类型/操作码
指令含义
JAL、JALR
跳转和链接:将PC+4保存在R31中,
目标为相对于PC(JAL)或寄存器(JALR)
TRAP
转移到操作系统的一个向量地址
ERET
从异常中返回用户代码,恢复用户模式
浮点
对DP和SP格式执行FP操作
ADD.D、ADD.S、ADD.PS
DP、SP数相加,一对SP数相加
SUB.D、SUB.S、SUB.PS
DP、SP数相减,一对SP数相减
MUL.D、MUL.S、MUL.PS
DP、SP浮点数相乘,一对SP数相乘
MADD.D、MADD.S、MADD.PS
DP、SP浮点数相乘加,一对SP数相乘加
DIV.D、DIV.S、DIV.PS
DP、SP浮点数相除,一对SP数相除
CVT._._
转换指令:CVT.x.y从类型x转换为类型y,
其中x和y为L(64位整数),W(32位整数),
D(DP)或S(SP)。两个操作数都是FRP
C._.D、C.__.S
DP和SP对比:“__”=LT,GT,LE,GE,
EQ,NE;在FP状态寄存器中置位
【责任编辑:book TEL:(010)68476606】
点赞 0