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

时间:2012-04-08 02:21:42

标签: 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)
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

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

enter image description here

1 个答案:

答案 0 :(得分:4)

让我们检查第一条指令的细分:beq $s0, $s2, exit

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

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

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

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

要查找将使用的Branch_Address,请检查最低有效16位:0000000000000100。该符号已扩展并向左移动2位以获取:0000000000000000 00000000000100000x00000010。该立即值将被添加到程序计数器,该计数器指向下一条指令:0x00400018。所以我们最终以Branch_Address = 0x00400028结束。我假设exit标签指向上面发布的五条之后的下一条指令,就在j指令之后。

寄存器很简单。 Read_register_1 = 0b10000Read_register_2 = 0b10010

Sign_extend_output只是即时字段扩展名:0x00000004

打开ALU控制信号。 ALUSrc控制寄存器文件和ALU之间的多路复用器。由于beq指令需要使用两个寄存器,因此我们需要从寄存器文件中选择Read data 2寄存器。我们没有使用立即字段进行ALU计算,就像使用addi指令一样。因此,ALUSrc0

ALUOpALU_control_input是从操作码创建的硬连线值。 ALUOp = 0b01ALU_control_input = 0b0110。 PG。计算机组织与设计的第323页,第4期。版本由Hennessey和Patterson修改和this网页有一个表格,其中包含beq指令的相应控制信号。 PG。 318有一个带有ALU控制位映射的表。

MemReadMemWrite0,因为我们没有访问内存;由于MemToReg为0,XMemWrite(无所谓); RegWrite0,因为我们没有写入寄存器文件; RegDstX,因为RegWrite为0;最后,找到Write_register,取16-20位(查看指令存储器和寄存器文件之间的多路复用器),0b10010