体系架构(二) 机器语言

汇编语言方便人们阅读,但数字电路只能理解0和1。因此需要将汇编语言写的程序从助记符号转换成仅使用0和1表示的机器语言(machine language)。
MIPS定义了3种指令格式:R类型I类型J类型

  • R类型指令对3个寄存器操作;
  • I类型指令对两个寄存器和一个16位立即数操作;
  • J类型(跳转)指令对一个26位的立即数操作。

1. R型指令——寄存器类型(register- type)

32位指令分为6个字段:oprsrtrdshamtfunct

1.1 操作编码

指令的操作编码为2个字段:op(也称为opcode或操作码)和funct(也被称为函数)。所有R类型指令的操作码都是0,特定R类型操作由funct字段决定。

例:add指令的opcode和funct字段分别为0(0000002)和 32(1000002)。类似地,sub指令的opcode和 funct字段为0和34。

1.2 操作数编码

指令的操作数编码包括3个字段:rsrtrd。前两个寄存器rs和rt是源寄存器。rd是目的寄存器。

1.3 移位操作字段

第5个字段shamt仅仅用于移位操作。在这些指令中存储在5位shamt字段中的二进制数值表示移位数。对于其他R类型指令,shamt 为0。

例:
R类型指令add和 sub的机器代码如下:
注意,在汇编语言指令中,目的寄存器是第一个寄存器,而在机器语言指令中,目的寄存器为第三个寄存器字段(rd)。
例如,汇编指令add $s0,$s1,$s2表示rs = $s1(17)、rt = $s2(18)和rd = $s0(16)。

例:
将下列汇编语言语句转换为机器语言。

add $t0,$s4,$s5

根据MIPS寄存器集,$t0,$s4,$s5分别是寄存器8、20、21。

add的opcode为0,funct 为32。各个字段和机器代码如图所示。

2. I型指令——立即数类型(immediate-type)

一条32位指令有4个字段:op、rs、rt和imm。

2.1 操作编码

指令的操作由opcode字段决定。

2.2 操作数

I类型指令有两个寄存器操作数和一个立即数操作数。imm字段代表一个 16位立即数。操作数在rs、rt和 imm三个字段中。rs和 imm常用作源操作数。在有些指令中(如 addi和lw), rt用作目的操作数;但在其他指令中(如sw) , rt也用作源操作数。

例:
一些I类型指令编码实例
负立即数表示为16位有符号二进制补码数。在汇编语言中,rt作为目的操作数放在前面,但在机器语言指令中,它是第二个寄存器字段。

例:
将下列I类型指令转换为机器码。

lw $s3,-24($S4)

根据MIPS寄存器集,$s3$s4分别为寄存器19和20。iw的opcode为35。rs 指定了基地址$s4,rt 指定了目的寄存器$s3,立即数imm编码16位偏移量-24。因此,指令的字段和机器代码如图所示。

I类型指令有一个16位立即数字段,但这个立即数用于32位操作中。例如,lw将16位偏移量与32位源寄存器相加。32位中的高16位应该是什么呢?对于正立即数,前16位为全0,但对于负立即数,高16位应该为全1。在1.4.6节中,它称为符号扩展。通过将符号位(最高有效位)复制到M位数的所有高位,可以将一个N位补码符号扩展为M位数。对二进制补码进行符号扩展并不改变它的值。

3. J型指令——跳转类型(jump-type)

这种指令格式有一个26位地址操作数addr,J类型指令由一个6位 opcode开始。剩下的位用于指定地址addr。

4. 解释机器语言代码

为了解释机器语言,必须对32位指令的每一个字段进行解码。不同的指令使用不同的格式,但是所有的指令都以一个6位的opcode字段开始。所以,开始解释的最好地方是首先查看opcode。如果是0,则指令为R类型,否则,为Ⅰ类型或J类型。
例:
首先,将指令转化为二进制格式,查看6位最高有效位,找到它们的opcode。opcode决定怎样解释其余的位。这两条指令的opcode分别是0010002(810)和0000002,(010),说明它们分别是addi和R类型指令。R类型指令的funct字段是1000102(3410),说明它是sub指令。两个机器指令等价的汇编代码如下图所示:

5.存储程序

存储程序:用机器语言编写的程序是一个表示指令的一系列32位数。与其他二进制数一样,这些指令存储在存储器中。这就是存储程序( stored program)的概念。
存储程序中的指令从存储器中检索或取出( fetch),由处理器执行。即使大型复杂程序也可以简化为一系列存储器读和指令执行。在 MPIS程序中,指令一般从地址Ox00400000开始存储。MIPS存储器地址是字节寻址,所以32位(4字节)指令地址每次增加4字节而不是1字节。

为了运行或执行( execute)存储程序时,处理器从存储器中顺序地取出指令。然后,数字电路硬件解码和执行这些取出的指令。(当前指令的地址存储在一个称为程序计数器(ProgramCounter,PC)的32位寄存器中,PC 并不在MIPS寄存器集的32个寄存器中)
为了运行图示的程序,操作系统将PC的值设为地址Ox00400000。处理器将这个存储器地址的指令读出,并执行指令0x8C0A0020。然后,处理器将PC增加4,变为Ox00400004,接着取出并执行该地址的指令,重复执行上述过程。

来自广东
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇