Mips 表示addi$s1、$0、4指令:记下控制信号的值

Mips 表示addi$s1、$0、4指令:记下控制信号的值,mips,computer-architecture,Mips,Computer Architecture,我正在做一个家庭作业,我需要写下5条指令的控制信号的值,并试图首先找出示例(底部的代码)。我需要做的5个说明是 Address Code Basic Source 0x00400014 0x12120004 beq $16,$18,0x0004 15 beq $s0, $s2, exit 0x00400018 0x8e080000 lw $8,0x0000($16) 16 lw $t0, ($s0) 0x0

我正在做一个家庭作业,我需要写下5条指令的控制信号的值,并试图首先找出示例(底部的代码)。我需要做的5个说明是

Address    Code        Basic                 Source

0x00400014  0x12120004  beq $16,$18,0x0004    15    beq $s0, $s2, exit
0x00400018  0x8e080000  lw $8,0x0000($16)     16    lw  $t0, ($s0)
0x0040001c  0x02118020  add $16,$16,$17       17    add $s0, $s0, $s1
0x00400020  0xae08fffc  sw $8,0xfffc($16)     18    sw  $t0, -4($s0)
0x00400024  0x08100005  j 0x00400014          19    j   loop
他做的例子是addi$s1,$0,4。现在我有这个理由:

    Address    Code       Basic                 Source
    0x00400028 0x20110004 addi $16,$0,4         20 addi     $s1, $0, 4   
我认为基本列中的4是不正确的。正确答案是什么

这是他为此做的样本,下面是他参考的控制信号图:

##--------------------------
# Example
# addi  $s1, $0, 4
# Although not supported as in Figure 4.24, the instruction can be easily
# supported with minor changes in the control circuit.

instruction_address=0x00400028 
instruction_encoding=0x20110004

OPcode=0b001000

Jump=0
Branch=0
Jump_address=0x00440010    # not used in this instruction
Branch_address=0x0040003C  # not used in this instruction

Read_register_1=0b00000
Read_register_2=0b10001
Sign_extend_output=0x00000004 

ALUSrc=1            # pick the value from sign_extend_output
ALUOp=0b00          # assume the same value as load/store instruction
ALU_control_input=0b0010    # add operation, as in load/store instruction

MemRead=0
MemWrite=0
MemtoReg=0          # select the ALU result 

RegDst=0
Write_register=0b10001      #register number for $s1
RegWrite=1

##--------------------------

让我们检查第一条指令的分解:
beq$s0,$s2,退出

指令地址在上面的地址列下给出:
0x00400014
。您也有编码:
0x12120004
。编码是机器指令。让我们用二进制表示指令:
000100 10000 10010 00000000000000 100

这是一个I型指令。第一组六位是操作码,第二组五位是源寄存器,第三组五位是临时寄存器,最后一组十六位是立即数

然后操作码为
0b000100
。由于这是一条I型指令,我们没有跳转到目标,因此
跳转
信号是
0
。但是,我们正在进行分支,因此
分支
信号是
1

要查找
跳转地址
,即使它被忽略,也要检查最低有效26位:
10000 10010 00000000 100
。由于地址是字对齐的,我们可以通过将跳转偏移量作为下一条指令和目标地址之间的有符号差来扩大可到达地址的范围。换句话说,如果我的目标地址距离下一条指令
8
字节(PC相对寻址),我将使用
2
表示偏移量。这就是为什么我们必须向左移动偏移量2位。因此,我们最终得到了
跳转地址
=
10 00010 01000 0000000000
0x8480010

要查找将要使用的
分支地址
,请检查最低有效16位:
0000000000000 100
。这是符号扩展并向左移动2位得到:
00000000000000000010000
0x00000010
。此立即值将添加到程序计数器,该计数器指向下一条指令:
0x00400018
。因此,我们最终以分支地址结束。我假设
exit
标签指向上面发布的五条指令之后的下一条指令,就在
j
指令之后

寄存器很简单<代码>读取寄存器1=
0b10000
读取寄存器2
=
0b10010

符号扩展\u输出
只是立即字段符号扩展:
0x00000004

接通ALU控制信号
ALUSrc
控制寄存器文件和ALU之间的多路复用器。由于
beq
指令需要使用两个寄存器,因此我们需要从寄存器文件中选择
读取数据2
寄存器。我们不使用立即数字段进行ALU计算,就像
addi
指令一样。因此,
ALUSrc
0

ALUOp
ALU\u control\u input
是从操作码创建的硬接线值
ALUOp
=
0b01
ALU控制输入
=
0b0110
。《计算机组织与设计》第323页,第4页。由Hennessey和Patterson修订的版本和网页上有一个表格,其中包含适用于
beq
指令的适当控制信号。第318页有一个带有ALU控制位映射的表


MemRead
MemWrite
0
,因为我们没有访问内存
MemToReg
X
(不必在意),因为
MemWrite
是0
RegWrite
0
,因为我们没有写入寄存器文件
RegDst
X
,因为
RegWrite
是0;最后,要找到
写入寄存器
,取位16-20(查看指令存储器和寄存器文件之间的多路复用器),它们是
0b10010

,实际上您没有问任何问题。我唯一的问题是ALU控制输入是如何派生的