马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
目次
盘算机硬件的操纵数
存储器操纵数
常数或立即数操纵数
有符号数和无符号数
指令的格式
逻辑操纵
决议指令
循环
盘算机硬件的操纵数
先从一条C语句入手
将其翻译为MIPS
此中a,b,c就是这条指令的操纵数。体现将b与c的和放入a中。
加法指令只有三个操纵数,也就是说只能一次完成两个数相加,下面的指令序列会完成四个数相加
- add a, b, c
- add a, a, d
- add a, a, e
复制代码 只能一次完成两个数相加体现了硬件简单性的计划原则。下面会知道,利用指令实际上不会写诸如a,b,c之类的字符,而是利用寄存器。
与高级语言差异,MIPS的算术运算被要求操纵数只能来自寄存器。寄存器是构成盘算机的根本单元。在MIPS体系布局中寄存器巨细为32位,同时拥有32个寄存器。在MIPS体系布局中也常把32位称作一个字(word)。
MIPS在利用寄存器时,用'$'后跟两个字符体现寄存器。用$s0,$s1...体现雷同C语言中的变量所对应的寄存器,用$t0,$t1...体现暂时变量对应的寄存器。
以该C赋值语句为例,将其翻译为MIPS指令,假设s0,...s4分别对应存储了a,..e
- add $t0, $s1, $s2 #b+c的结果存在临时变量寄存器t0中
- add $t1, $s3, $s4 #同上
- add $s0, $t0, $t1
复制代码 MIPS中#后是表明,注意这种语言一行只有一条指令,且表明是在一行的末端竣事
存储器操纵数
高级语言中常有数组和布局体,而且通常巨细不止一个字,这种数据布局就会存储在内存中,而内存就是存储器,磁盘更风俗叫做io装备。
由于MIPS算术指令只能操纵寄存器,因此必须有一种本领,能将内存中的数据加载到寄存器中。
这些指令叫做数据传输指令。
为了访问内存中的字,必须给出所在。内存中的所在是按字节编排的,也就是说每个相邻的所在相差1
图中每一块巨细一个字节。
将数据从内存加载到寄存器通常称为取数(load)指令,实际MIPS取数指令助记符是lw,操纵数有三个,第一个体现要把数据存到哪个寄存器,第二个是所在偏移量(单元为字节,要求是常数),第三个是基址寄存器。
假设a存在s0,b存在s1,A所在存在s2。
- lw $t0, 32($s2) #一个字大小为32位,也就是4字节,8个字就得偏移32字节
- add $s0, $s1, $t0
复制代码 MIPS字的起始所在是4的倍数,这叫做对齐限定。字在内存中如图存储。
MIPS另有一类指令是将寄存器中的数据复制到存储器中,叫做存数(store)指令。MIPS记作sw,用法与lw雷同,只是第一个操纵数代表要从哪个寄存器中得到数据。
常数或立即数操纵数
仅仅从已经先容的指令来看,要利用常数,只能从存储器取出(lw),如要将a+4
- lw $t0, AddrConstant($s1)#AddrConstant为某一常数偏移量,将4加载到t0
- add $s0, $s0, $t0
复制代码 假如要制止利用取数指令,可利用addi指令
像这种加法叫加立即数(add immediate),常数操纵数出现频率高,像这种带立即数的指令,比从存储器种取值快许多,能耗也较低。
常数0可简化指令集。比方,数据传输指令可视为操纵数为0的加法。MIPS将$zero恒置为0,编号也为0
有符号数和无符号数
有符号数在MIPS中用补码体现。须要注意的是,当不满32位的数被存储时,高位会补上符号位。
像0100,存在寄存器中
- 00000000 00000000 00000000 00000100
复制代码 1100,存在寄存器中
- 11111111 11111111 11111111 11111100
复制代码 MIPS有一些末端为u的指令操纵无符号数,具体反面可以见到。
指令的格式
指令以二进制的情势存储,现在我们可以把指令翻译成二进制。
全部的寄存器会被映射为数字,$s0~$s7映射到16~23, $t0~$t7映射到8~15。
以该指令为例,先将其翻译为十进制,再转为二进制。
呆板指令分为多个字段,本例第一个和末了一个告诉MIPS盘算秘密实行加法操纵,第二个和第三个体现源操纵数寄存器,第四个字段体现存放结果的寄存器,第五个字段没有用到,故置为0。
截取《盘算机构成与计划 硬件/软件接口》中干系阐明
这种指令格式在某些场景大概不实用,如lw指令须要传入偏移量,5位是不敷用的,这时,想要增长位数,但是MIPS的计划是,全部指令的长度都雷同,如许,就会接纳折中方案:全部指令长度雷同,但差异范例指令接纳差异指令格式。如上述指令就是R型。另一种是I型,用于传输立即数。
在这种I型格式中,立即数巨细仍然有限定。可以看到这种格式下,很难增长寄存器的数量,由于寄存器序号会使得rs,rt字段增长位。
逻辑操纵
一张图即可办理,用法也与其他指令雷同。
决议指令
盘算机的运算本领强盛,但盘算机与盘算器的差异在于盘算性能实行决议指令,也就是条件分支指令。MIPS有两条雷同C语言 if和 go to的指令
- beq regsiter1, register2, L1
复制代码 体现若寄存器register1 和register2的值相称,跳转到L1标签。beq(branch if equal),相称则分支。
- bne regsiter1, register2, L1
复制代码 体现若寄存器register1 和register2的值不等,跳转到L1标签。bne(branch if not equal),不等则分支。
还需先容另一种分支指令——无条件分支
j为jump的缩写
- if (i == j)
- f = g + h;
- else
- f = g - h;
复制代码 现在将该C语句编译为MIPS指令。
假设i存在s0,j存在s1,f,g,h分别存在s2,s3,s4
- bne $s0, $s1, Else
- add $s2, $s3, $s4
- j Exit
- Else: sub $s2, $s3, $s4
- Exit:
复制代码 循环
条件分支指令可以实现循环
- while (save[i] == k)
- i += 1;
复制代码 假设i和k存在s3和s5中,save的基址存在s6中。
- Loop: sll $t1, $s3, 2 #需要将i×4
- add $t1, $s6, $t1
- lw $t0, 0($t1) #要求偏移量为常数
- bne $t0, $s5, Exit
- addi $s3, $s3, 1
- j Loop
- Exit:
复制代码
|