指令集:一个给定的计算机体系结构所包含的指令集合。
指令中包含:
操作码 (Op code)—— Do this
源操作数引用 (Source Operand reference)—— To this
结果操作数引用(Result Operand reference)—— Put the answer here
下一个指令引用(Next Instruction Reference)—— When you have done that, do this
指令周期演示图:
指令表示:在机器代码中,每个指令都有唯一的位模式。
指令类型:数据处理,数据储存(主内存),数据移动(I/O),程序流控制
存储程序概念(存储程序):多种类型的指令和数据均以数字形式存储与存储器中的概念。
极计算机硬件的操作
每条MIPS指令只执行一个操作。与加法类似的指令一般都有三个操作数:两个进行运算的数和一个保存结果的数。
a = b + c + d - e
add a, b, c # the sum of b and c is placed in a
add a, a, d # the sum of b, c, and d is now in a
sub a, a, e # the difference of a and e is now in a
Q:对于一个给定的功能,用下列哪种编程语言实现可能花费的代码行数最多?将下面3种语言排序:
1. java 2. C 3. MIPS汇编语言
计算机硬件的操作数
MIPS算术运算指令的操作数必须来自寄存器(register)。在MIPS体系结构中寄存器的大小为32位,在MIPS体系结构中将其称为“字”
字(word):计算机中的基本访问单位,通常是32位一组,在MIPS体系结构中与寄存器大小相同。
MIPS算术指令的三个操作数必须从32个32位寄存器中选取。
寄存器个数限制为32个的原因:1. “越小越快”,大量的寄存器可能会使时钟周期变长,因为电信号传输更远的距离必然花费更长的时间。2. 受指令格式位数的限制
约定:用“$”后面跟两个字符来表示一个寄存器。使用$s0, $s1, ...来表示与C和Java程序中的变量所对应的寄存器;用$t0, $t1, ...来表示将程序编译为MIPS指令时所需的临时寄存器。
例:f = ( g + h ) - ( i + j ),变量f、g、h、i、j依次分配给寄存器$s0, $s1, $s2, $s3 和 $s4。编译后的MIPS码是什么?
add $t0, $s1, $s2 #register $to contains g + h
add $t1, $s3, $s4 #register $t1 contains i + j
sub $s0, $t0, $t1 # f gets $t0 - $t1, which is ( g + h ) - ( i + j )
存储器操作数
对于像数组和结构那样的复杂数据结构,其中的数据元素可能远多于寄存器的个数。如何访问这样大的结构呢?
这些数据结构是存放在存储器中的。而MIPS的算术运算指令只对寄存器进行操作,因此MIPS必须包含在存储器和寄存器之间传送数据的指令,这些指令被叫做数据传送指令(data transfer instruction)。为了访问存储器中的一个字, 指令必须给出存储器地址(address)。
存储器就是一个很大的下标从0开始的一维数组,地址就相当于数组的下标。
取数指令(load):指令符为lw(load word的缩写)。格式如下:
lw $s1, 5($s0)
格式为:操作码+ 目标寄存器+ 用来访问存储器的常数+ 存放数组的起始地址的寄存器
基址(base address):数组A的起始地址
基址寄存器(base register):存放基址的寄存器
偏移量(offset):数据传送指令中的常量(取数组中下标为x的元素的值)
例:设A是一个含有100个字的数组,变量g, h仍分配给寄存器$s1, $s2。设数组A的起始地址(基址)存放在寄存器 $s3中。试编译下面的C赋值语句:g = h + A[8]
解答:lw $t0, 8($s3) # temporary reg $t0 gets A[8]
add $s1, $s2, $t0 # g = h + A[8]