- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在做作业,我需要记下 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
##--------------------------
最佳答案
让我们检查第一条指令的分解: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 0000000000010000
或 0x8480010
。
要找到将要使用的 Branch_Address
,请检查最低有效 16 位:0000000000000100
。这是符号扩展并向左移动 2 位得到:0000000000000000 0000000000010000
或 0x00000010
。此立即值将添加到程序计数器,指向下一条指令:0x00400018
。所以我们最终以 Branch_Address
= 0x00400028
结束。我假设 exit
标签指向您在上面发布的五个指令之后的下一条指令,就在 j
指令之后。
寄存器很简单。 Read_register_1
= 0b10000
和 Read_register_2
= 0b10010
。
Sign_extend_output
只是符号扩展的直接字段:0x00000004
。
关于 ALU 控制信号。 ALUSrc
控制寄存器文件和 ALU 之间的多路复用器。由于beq
指令需要使用两个寄存器,我们需要从寄存器文件中选择Read data 2
寄存器。我们没有使用立即字段进行 ALU 计算,就像使用 addi
指令一样。因此,ALUSrc
为0
。
ALUOp
和 ALU_control_input
是从操作码创建的硬连线值。 ALUOp
= 0b01
和 ALU_control_input
= 0b0110
。 Pg。 Computer Organization and Design 的 323,第 4 名。由 Hennessey 和 Patterson 以及 this 修订的版本网页有一个表格,其中包含用于 beq
指令的适当控制信号。 Pg。 318 有一张 ALU 控制位映射表。
MemRead
和 MemWrite
是 0
因为我们没有访问内存; MemToReg
是 X
(不关心)因为 MemWrite
是 0; RegWrite
是 0
因为我们没有写入寄存器文件; RegDst
是 X
因为 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/
我正在执行 UPDATE .WRITE() 语句,并发现它显然只有在您像这样定义它时才有效: string sql = "UPDATE [dbo].[Table] SET [Column].WRITE
我在 Unix 系统上用 C 编程。我知道: write(fd,"ABCD",4); 比这样做更好: write(fd, "A", 1); write(fd, "B", 1); write(fd, "
func hash(s string) uint32 { h := fnv.New32a() h.Write([]byte(s)) return h.Sum32() } 对于这
在经典的 asp 页面中,有人告诉我您可以使用 vbscript 或 jscript。而 jscript 就是 javascript。 所以我不确定 Response.Write、Response.W
当 openssl 子进程尝试 write() 到本地目录时,我收到此错误。在调用 write() 之前连接已关闭。它没有与 ssl 连接,因为我什至无法从 nodejs 文档启动示例代码。 我错过了
最近我在试验netty。我遇到了以下问题: ctx.channel().write(new TextWebSocketFrame("hello")) 没有在客户端返回 hello,但是 ctx.cha
请解释以下内容: def feed(data): import os print "DATA LEN: %s" % len(data) f = open("copy", "w") f.
有什么区别debug.write 和 Trace.write ?每个应该什么时候使用? 最佳答案 在典型的发布构建配置中,Debug class 被禁用并且什么都不做。 Trace但是,仍然可以在发行
我只是想知道,就性能而言,哪个更好(我在 FileStream 中使用 StreamWriter): 多次调用 Stream.Write(): StreamWriter sw = new Stream
我发现自己写给 stringwriter,然后在函数末尾执行 resp.Write(sw.ToString())。这是不必要的吗?如果我多次使用 HttpResponse.Write,即使我的页面是
我正在尝试通过 JavaScript 文件从 electron 打开一个新窗口,它可以工作,并打开了新窗口,但我无法将 HTML/文本写入新文件。我收到那个错误: Cannot read proper
我们对 QIODevice::write 的一般行为和具体的 QTcpSocket 实现感到非常困惑。有一个 similar question已经,但答案并不令人满意。主要的混淆源于分别提到的 byt
我知道这听起来像是一个愚蠢的问题: write(*,*) 和 write(6,*) ?我在我研究所的 super 计算机上运行一个复杂的代码,它通过一个不同于 6 的单元号输出一个数据文件,显然编译的
我有一个结构体,它可以通过一系列复杂的方法调用转换为文本,其中包含大量 write!调用。此文本可以写入文件或调试日志。我正在决定是否使用 fmt::Write 或 io::Write .我不能真正使
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
In the C standard library, an output can't be followed by an input and vice versa. 对于Linux API,可以在re
我希望能够为一件事做 document.write。然后延迟半秒,然后再记录。写一些。你知道这是否可能吗?而且,如果是这样,怎么办?到目前为止,我已经尝试过了,但没有奏效: document.writ
为什么通过 onclick 属性调用的 write() 函数解析为 document.write() 并替换文档?有什么办法可以阻止这种情况发生吗? Write Function Alternat
我想创建一个包含多个“页面”的文本文件,并将每个页面的字节偏移量记录在一个单独的文件中。为此,我将字符串打印到主输出文件并使用 bytes_written += file.write(str) 计算字
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我是一名优秀的程序员,十分优秀!