一条指令必须明显或隐含包含的信息:
-
操作码:指定操作类型
(操作码长度:固定/可变)
-
源操作数参照:一个或多个源操作数所在的地址
(操作数来源:主(虚)存、寄存器、I/O端口、指令本身)
-
结果值参照:产生的结果存放何处(目的操作数)
(结果地址:主(虚)存、寄存器、I/O端口)
-
下一条指令地址:下条指令存放何处
(下条指令地址:主(虚)存,正常情况隐含在PC中,改变顺序时由指令给出)
4.1 指令格式的设计
尽量短、有足够的操作码位数、唯一解释、指令字长是字节的整数倍、合理地选择地址字段的个数、指令尽量规整
4.1.1 指令中的地址
零地址指令:
- 无需操作数 如:空操作/停机等
- 所需操作数为默认的 如:堆栈/累加器
一地址指令:
其地址既是操作数的地址,也是结果的地址
- 单目运算:如取反、取负等
- 双目运算:另一操作数为默认的 如累加器等
二地址指令(最常用)
分别存放在双目运算中两个操作数,并将其中一个地址作为结果的地址
形式:
OP | A1 | A2 |
---|
三地址指令(RISC风格)
分别作为双目运算中两个源操作数的地址和一个结果的地址
形式:
OP | A1 | A2 | A3 |
---|
多地址指令
用于成批数据处理的指令,如:向量、矩阵等运算的SIMD指令
4.1.2 操作数类型和存储方式
-
地址(指针)
被看成无符号整数,用来参加运算以确定主(虚)存地址
-
数值数据
定点数(整数):一般用二进制补码表示
浮点数(实数):大多数机器采用IEEE 754标准
十进制数:用NBCD码表示,压缩、非压缩(汇编程序设计时使用)
-
位、位串、字符和字符串
用来表示文本、声音和图像等,32bits是一个字,8bits是一个字节
-
逻辑(布尔)数据
按位操作(0-假、1-真)
4.1.3 寻址方式
有效地址的含义:操作数所在存储单元的地址(可能是逻辑地址或物理地址),可通过指令的寻址方式和地址码计算得到。
假设A=地址字段值,R=寄存器编号,EA=有效地址,(X)=X中的内容
OP | R | A | … |
---|
方式 | 算法 | 优点 | 缺点 |
---|---|---|---|
立即 | 操作数=A | 指令执行速度快 | 操作数幅值有限 |
直接 | EA=A | 有效地址计算简单 | 地址范围有限 |
间接 | EA=(A) | 有效地址范围大 | 多次存储期访问 |
寄存器 | 操作数=® | 指令执行快,指令短 | 地址范围有限 |
寄存器间接 | EA=® | 地址范围大 | 额外存储器访问 |
偏移 | EA=A+® | 灵活 | 复杂 |
堆栈 | EA=栈顶 | 指令短 | 应用有限 |
偏移:将直接方式和寄存器间接结合起来,有相对、基址、变址三种。R给出一个固定的地址,通过变换A则可以访问不同的地址,例如数组里面,R可以明显给出,也可以隐含给出,可以为PC、基址寄存器B、变址寄存器I
- 相对寻址:EA=A+(PC) 相对于
当前指令处
位移量为A的单元 - 基址寻址:EA=A+(B) 相对于
基址(B)处
位移量为A的单元 - 变址寻址:EA=A+(I) 相对于
首址A
位移量为(I)的单元
4 .2 程序的机器级表示
4.2.1 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 | 为OS保留 | |
gp | 28 | 全局指针 | 是 |
sp | 29 | 栈指针 | 是 |
fp | 30 | 帧指针 | 是 |
ra | 31 | 过程调用返回地址 | 是 |
寄存器的汇编表示以$符号开始,可以使用名称(如$a0),也可以使用编号(如$4)。
MIPS还提供了32个32位的单精度浮点寄存器,用汇编符号$f0~$f31表示。它们可配对成16个64位浮点寄存器,用来表示64位双精度浮点数。
另外,MIPS中提供了两个乘商寄存器Hi和Lo,它们无须在指令中显示给出。用32位的Hi和Lo可实现64位寄存器。乘法时,Hi和Lo联合用来存放64位成绩;执行除法运算时,最终的余数存放在Hi中,商在Lo中
MIPS中用程序计数器PC指出下条指令的地址。
MIPS的存储器按字节编址,大端存放,只能通过load/store指令访问存储器数据。
对于立即数,指令中给出的位数为16位,指令执行是,需要将其进行符号扩展或0扩展,变成32位操作数后才能参加运算。
数据要求按边界对齐(地址是4的倍数)
4.2.2 MIPS 指令格式和寻址方式
MIPS是典型的RISC处理器,采用32位定长指令字,操作码字段也是固定长度,没有专门的寻址方式手段,由指令格式确定各操作数的寻址方式
R-型指令
属于RR型指令,即操作数和结果都存放在寄存器中,这里R表示寄存器(register)。其操作码OP为000000,操作类型由func字段指定。
-
若是双目运算类指令,则rs和rt的内容分别作为第一和第二源操作数,结果送rd;
-
若是移位指令,则对rt的内容进行移位,结果送rd,所移位数由shamt字段给出。
只使用寄存器寻址。
I-型指令
是立即数型指令,这里I表示立即数(immediate operand)。
- 若是双目运算类指令,则将rs的内容和离结束分别作为第一和第二源操作数,结果送rt。
- 是load/store 指令,则将rs的内容和立即数符号扩展后的内容相加作为内存单元地址,load指令将内存单元内容送rt,store指令将rt内容送内存单元;
- 若是条件转移(分支)指令,则对rs和rt内容进行指定的运算,根据运算的结果,决定是否转到转移目标地址处执行,转移目标地址通过相对寻址方式得到,即将PC的内容和立即数符号扩展后的内容相加后得到
4中寻址方式:寄存器、立即数、相对、基址或变址寻址
J-型指令
主要是无条件跳转指令。指令中给出的是26位直接地址,只要将当前PC的高4位拼上26位直接地址,最后添两个0就可以得到32位的跳转目标地址。寻址方式为变通的直接寻址。
寻址方式:
- R-format:rs
- I-format: immed
- Base或Index(基址或变址): rs(register)+immed
- PC-relative(相对寻址):PC+4+immed (+4意思是执行了,进入下一指令)
- J-format(伪直接寻址): M e m o r y = P C 31 ∼ 28 ∣ ∣ a d d r . ∣ ∣ 00 Memory=PC_{31\sim28}||addr.||00 Memory=PC31∼28∣∣addr.∣∣00,末尾两个0保证是4的倍数
4.2.3 MIPS汇编语言(P105)
类别 | 指令名称 | 汇编举例 | 含义 | 备注 |
---|---|---|---|---|
算术访问 | load word | add $s1,$s2,$s3 | $s1=$s2+$s3 | 三个寄存器操作数 |
subtract | sub $s1,$s2,$s3 | $s1=$s2-$s3 | 三个寄存器操作数 | |
存储访问 | load word | lw $s1,100($s2) | $s1=Memory[$s2+100] | 从内存取一个字到寄存器 |
store word | sw $s1,100($s2) | Memory[$s2+100]=$s1 | 从寄存器取一个字到内存 | |
逻辑运算 | and | and $s1,$s2,$s3 | $s1=$s2 & $s3 | 三个寄存器操作数,按位与 |
or | or $s1,$s2,$s3 | $s1=$s2|$s3 | 三个寄存器操作数,按位或 | |
nor | nor $s1,$s2,$s3 | $s1=~($s2|$s3) | 三个寄存器操作数,按位或非 | |
and immediate | andi $s1,$s2,100 | $s1=$s2 & 100 | 寄存器和常数,按位与 | |
or immediate | ori $s1,$s2,100 | $s1=$s2|100 | 寄存器和常数了,按位或 | |
shift left logical | sll $s1,$s2,10 | $s1=$s2<<10 | 按常数对寄存器逻辑左移 | |
shift right logical | srl $s1,$s2,10 | $s1=$s2>>10 | 按常数对寄存器逻辑右移 | |
条件分支 | branch on equal | beq $s1,$s2,L | if($s1==$s2)go to L | 相等则转移 |
branch on not equal | bne $s1,$s2,L | if($s1!=$s2) go to L | 不相等则转移 | |
set on less than | slt $s1,$s2,$s3 | if($s2<$s3) $s1=1; else $s1=0 | 小于则置1,否则位0,用于后续指令判0 | |
set on less than immediate | slt $s1,$s2,100 | if($s1< 100)$s1=1; else $s1=0 | 小于常数则置1,否则为0,用于后续指令判0 | |
无条件跳转 | jump | j L | go to L | 直接跳转至目标地址 |
jump register | jr $ra | go to $ra | 过程返回 | |
jump and link | jal L | $ra=PC+4;go to L | 过程调用 |