gpt4 book ai didi

mips - 代表 addi $s1, $0, 4 指令 : write down the value of the control signals

转载 作者:行者123 更新时间:2023-12-01 12:55:17 25 4
gpt4 key购买 nike

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

最佳答案

让我们检查第一条指令的分解: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。 Computer Organization and Design 的 323,第 4 名。由 Hennessey 和 Patterson 以及 this 修订的版本网页有一个表格,其中包含用于 beq 指令的适当控制信号。 Pg。 318 有一张 ALU 控制位映射表。

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

关于mips - 代表 addi $s1, $0, 4 指令 : write down the value of the control signals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10059905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com