Mips 表示addi$s1、$0、4指令:记下控制信号的值
我正在做一个家庭作业,我需要写下5条指令的控制信号的值,并试图首先找出示例(底部的代码)。我需要做的5个说明是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
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
是0RegWrite
是0
,因为我们没有写入寄存器文件RegDst
是X
,因为RegWrite
是0;最后,要找到写入寄存器
,取位16-20(查看指令存储器和寄存器文件之间的多路复用器),它们是0b10010
,,实际上您没有问任何问题。我唯一的问题是ALU控制输入是如何派生的