3

我正在做一个作业,我需要写下 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

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

在此处输入图像描述

4

1 回答 1

4

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

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

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

那么操作码就是0b000100. 由于这是一条 I 型指令,我们不会跳转到目标,因此Jump信号是0. 但是,我们正在分支,所以Branch信号是1

要找到Jump_Address,即使它被忽略,请检查最低有效 26 位:10000 10010 0000000000000100。由于地址是字对齐的,我们可以通过将跳转偏移量作为下一条指令和目标地址之间的有符号差来扩大可到达地址的范围。换句话说,如果我的目标地址8与下一条指令相距字节(PC 相对寻址),我将用它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从寄存器文件中选择寄存器。我们没有像addi指令那样使用立即数字段进行 ALU 计算。因此,ALUSrc0

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

MemRead并且因为MemWrite我们0没有访问内存;MemToRegX(不关心),因为MemWrite是 0;RegWrite0因为我们没有写入寄存器文件;RegDstX因为RegWrite是 0;最后,要找到Write_register,取第 16-20 位(查看指令存储器和寄存器文件之间的多路复用器),它们是0b10010

于 2012-04-08T17:48:01.397 回答