计算机组成原理与接口技术笔记(一)

一、MIPS操作数
32个寄存器:用于快速存取,且只能对寄存器中的数执行算数操作
2^30个存储器字:只能通过数据传输指令访问。
处理器只将少量的数据保存在寄存器中,但存储器有大量的数据元素,因此,复杂数据结构是存放在存储器中的。

常数或立即数操作数
由于要使用常数必须先将其从存储器中取出,这种操作效率低下。专门使用addi指令,这种有一个常数操作数的快速加法指令叫做立即数,这样,只需写成:
addi $s3,$s3,4;

例1:编译一个操作数在存储器中的C赋值语句
g=h+A[8];
lw $t0,8($s3);数组基址在$s3中,偏移地址为8*4
add $s1,$s2,$t0;

例2:假设变量h放在寄存器$s2中,数组A的基址放在$s3中。则A[12]=h+A[8];
lw $t0,32($s3)
add $t0,$t2,$t0;
sw $t0,48($s3);

二、MIPS汇编语言
1.算术
2.数据传输
3.逻辑
例如:

逻辑右移(sll):sll $t2,$s0,4;

0 0 16 10 4 0
op rs rt rd shamt funct
sll的编码在op字段和funct字段都为0,rd为10(寄存器$t2),rt为16(寄存器$s0),shamt为4,rs字段没有使用,被置为0。
按位与(AND):and $t0,$t1,$t2

4.条件分支
beq register1,register2,L1该指令表示:register1和register2数值相等,则转到标签为L1的语句执行。
bne register1,register2,L1不相等则转到标签L1
例如将c语言if语句编译后形成的MIPS代码。
if(i==j)f=g+h;else f=g-h;
bne $s3,$s4,Else
add $s0,$s1,$s2
j Exit
Else:sub $s0,$s1,$s2
Exit:

无条件跳转

三、有符号数与无符号数
0000 0000 0000 0000 0000 0000 0000 0000=0;
0000 0000 0000 0000 0000 0000 0000 0001=1;
0000 0000 0000 0000 0000 0000 0000 0010=2;
~~~~
0111 1111 1111 1111 1111 1111 1111 1101=2147483645
0111 1111 1111 1111 1111 1111 1111 1110=2147483646
0111 1111 1111 1111 1111 1111 1111 1111=2147483647
1000 0000 0000 0000 0000 0000 0000 0000=-2147483648
1000 0000 0000 0000 0000 0000 0000 0001=-2147483647
1000 0000 0000 0000 0000 0000 0000 0010=-2147483646
~~~~
1111 1111 1111 1111 1111 1111 1111 1101=-3
1111 1111 1111 1111 1111 1111 1111 1110=-2
1111 1111 1111 1111 1111 1111 1111 1111=-1

二进制补码中最大负数-2147483648没有相应的正数与之对应,这种不平衡会带来一定的麻烦,但是不会给硬件设计人员带来困扰上述表示方法可以使用2的幂次的方式来表示正的和负的32位数:
(x31*(-2^31))+(x30*2^30)+(x29*2^29)+....+(x1*2^1)+(x0*2^0)
符号为被-2^31乘,其余的为仍按前面的方法计算。
例如:
1111 1111 1111 1111 1111 1111 1111 1100
=(-1*2^31)+(1*2^20)+(1*2^29)+...+(1*2^2)+(0*2^1)+(0*2^0)
=-2147483648+2147483644
=-4
【注:求反的捷径】
1.对2求反,然后通过对-2求反来对结果进行检查。
取反再加1
2+(-2)=0

四、计算机指令的表示
指令的各部分都可以看成一个独立的数,将这些数拼接在一起就形成了指令。
寄存器$s0~$s7影射到寄存器16~23,同时,寄存器$t0~$t7映射到寄存器8~15.因此,$s0表示寄存器16,$s1表示寄存器17
例如:将一条MIPS汇编语言指令翻译成一条机器指令
add $t0,$t1,$t2的MIPS指令,首先给出其十进制数表示形式。
0  17  18  8  0  32
(17=$s1)(18=$s2)(8=$t0),第五个字段在这条指令中没有用到,故置为0,第一个字段和最后一个字段(0和32)组合起来告诉MIPS计算机,该指令要完成加法运算。

也可以表示成二进制的形式:

000000 10001 10010 01000 00000 100000
6位 5位 5位 5位 5位 6位
为了将它与汇编语言区别分开来,把指令的数字形式称为机器语言,这样的指令序列叫做机器码。

MIPS字段

R型指令(用于寄存器):为了是讨论变得简单,给MIPS指令的字段命名如下:
op      rs     rt     rd     shamt     funct
6位     5位    5位    5位    5位       6位
.op:指令的基本操作,通常称为操作码。
.rs:第一个源操作数寄存器。
.rt:第二个源操作数寄存器。
.rd:用于存放操作结果的目的寄存器
.shamt:移位量。(移位指令和该术语,指令不使用该字段)
.funct:功能。一般称为功能码,用于指明op字段中操作的特定变式。

I型指令(用于立即数):立即数和数据传送指令用的就是这种格式。
op      rs      rt      constant or address
6位     5位     5位     16位

例如:lw $t0,32($s3) #temporary reg $t0 gets A[8]
这里,19(寄存器$s3)存放在rs字段,8(寄存器$t0)存放于rt字段,32存放于address字段
35     19     8      32
lw     $s3    $t0    adress

猜你喜欢

转载自blog.csdn.net/weixin_37603007/article/details/79754962