计算机只能理解0和1,需要将汇编语言翻译为机器语言。因此汇编语言的操作码都有对应编码。
MIPS使用32位的指令。
例如0x8A46C431,就是一条指令的机器语言表示。
对于MIPS汇编语言转换成的机器语言,计算机在处理时会先判别操作码,明确指令的具体操作,再根据此判别选择该指令其余机器码的解码方式。
机器语言与汇编语言的相互转化,就是十六进制与二进制的相互转化和人类可读指令与机器指令的解释与翻译。
以下是对三种指令类型相应解码方式的介绍:
R-类型指令
32位指令分为6个字段:op, rs, rt, rd, shamt, funct
op -> operand
rs 推测 r代表register s代表source
rt 不知道t代表什么
rd 推测 d代表destination
funct -> function
shamt不知道
op占6位,为操作码,所有R-指令中op为0
rs,rt,rd各占5位,为寄存器编码,其中rs,rt为源寄存器,rd为目的寄存器
shamt占5位,只在移位操作中使用,表示移位数,其他指令中shamt为0。
funct占6位,是区分R-指令的类操作码。
add $t0, $s2, $s3
这里$t0 的编码8就是rd的值, $s2的编码18就是rs的值, $s3的编码19就是rt的值
op为0,shamt为0, funct就是add的编码32
注意,rs,rt,rd的顺序与汇编语言中各操作数的顺序并不相同
I-类型指令
32位指令分为4个字段:op,rs,rt,imm
imm -> immediate
op仍然6位,rs,rt仍然5位
rs,rt有时为目的寄存器有时为源寄存器,一般rs为源寄存器,sw中rs为目的寄存器,rt为源寄存器,而addi,lw中,rs为源寄存器,rt为目的寄存器
imm一般为源操作数,占16位,为立即数,补码编码
addi $t0, $s2, 2
这里$t0 为rt, $s2为rs
注意这里rs,rt的顺序一般和汇编语言中两个寄存器操作数的顺序相反,但也有特例(如sw)
2为16位数,却与32位数做加法,这时2会补位,且是符号补位,不会改变数值。
J-类型指令
有一个操作码op与一个26位的立即数addr(address),没有寄存器作为操作数。仅用于跳转指令。addr用于指定地址。
程序存储
把一列指令,也就是程序,存到存储器中,执行时顺序执行。运行新程序时,只需把新程序写入存储器。这就是程序存储带来的便利。
把程序中的指令从存储去中找到或者取出,传给处理器执行。这样,复杂程序就得到了简化。
MIPS中,程序一般从地址0x00400000开始存储。
运行程序时,有一个程序计数器(program counter),简称PC,用于指向处理器要处理的指令的地址。处理器从存储器取出PC指向的指令并处理,处理完成后PC增加4(字地址是4的倍数),处理器继续处理新的指令。
微处理器的体系结构状态(由PC与寄存器文件组成)保存了程序的状态。如果微处理器某一时刻保存了体系结构状态,就可以中断程序,做别的事,做完别的事之后还可以回来继续中断的程序,而不会受到影响。