【问题标题】:representing the addi $s1, $0, 4 instruction: write down the value of the control signals代表 addi $s1, $0, 4 指令:记下控制信号的值
【发布时间】:2012-04-08 02:21:41
【问题描述】:

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

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

【问题讨论】:

  • 你实际上并没有问过问题。

标签: mips computer-architecture


【解决方案1】:

让我们检查第一条指令的细分: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,因为我们没有访问内存; MemToRegX(不在乎)因为 MemWrite 是 0; RegWrite0 因为我们没有写入寄存器文件; RegDstX,因为 RegWrite 是 0;最后,要找到Write_register,取位16-20(查看指令存储器和寄存器文件之间的多路复用器),即0b10010

【讨论】:

  • 我唯一的问题是 ALU_control_input 是如何推导出来的
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 2013-02-23
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-19
相关资源
最近更新 更多