- 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/
我的老师说你可以像这样简单地将一个字符加载到寄存器中: li $s2 "A" li $s1 "0" 除了,当我将我的文件加载到 Qtspim 中时,它一直向我抛出一个语法错误。有谁知道我的老师是否对我
我正在使用二进制 MIPS 指令,我发现 this helpful document .但是,我需要澄清一下:所有分支指令都具有立即值。这是立即值符号扩展吗? 大多数其他立即数是,如果不是,那将意味着
我有一个寄存器($t2),它有一个随机生成的数字,然后我乘以 4。我的问题是,在使用 lw 指令时,是否可以将 $t2 中的值用作偏移量? 最佳答案 在 MIPS 中,您可以使用寄存器、偏移量或两者的
因此,我正在MIPS中构建一个计算器程序,并且试图编写乘法和除法函数。 目前,我像这样在循环中读取整数: li $v0, 5 syscall 然后根据用户要执行的操作最终调用我的函数multi和div
我们目前正在讨论 MIPS 架构。我逐渐了解了计算机体系结构和 MIPS 汇编,这很好。 但是,我尝试用谷歌搜索这个答案,但没有找到合适的答案。我对 ISA 和微架构设计下面的一层感到困惑。 MIPS
我正在研究分支延迟槽。在 spim 上尝试过。 j some j a j b j c j d ori $9, $0, 13 some: a: b: c: d: 令我惊讶的是,它将 9 美元更改
好吧,这个问题更像是一个讨论。我有一个在 VHDL 中实现 pipelined MIPS 处理器的项目。 我完全熟悉流水线的概念,但我从未用 VHDL 实现它。在VHDL 中学习流水线处理器 的实现有
关于带有流水线和转发的 MIPS 架构: add $s0, $t1, $t2 sw $s0, 0($sp) add 指令将在第 3 步(执行操作)准备好结果,但我假设 sw 指令需要第 2 步(指令解
我刚开始学习 MIPS 指令的异常处理程序。 我需要让我的程序有算术溢出异常,以便我可以测试我的异常处理程序。 我有两个数组 A 和 B。数组 A 有十六进制数,数组 B 有整数。 如何通过添加十六进
我正在学习微编程,但对微指令到底是什么感到困惑。我正在使用 MIPS 架构。我的问题如下 例如,我有 ADD 指令,微指令会是什么样子? add指令有多少条微指令。在网上有什么地方可以看到 MIPS
我需要多少档才能正确执行以下指令。我对我所做的事情有点困惑,所以我在这里看到专家的答案。 lw $1,0($2); beq $1,$2,Label; 请注意,检查是否会发生分支将在解码阶段完成。但是源
.data stack: .word 3, 2 .text .globl main main: la $s1, stack #assign stack start
我正在用 MIPS 编写一个回文检查器,我试图让它不区分重音,这样像“ahà”这样的东西也会被认为是一个回文。然而,它看起来并不像小写和大写字母之间有固定值的不区分大小写的场景那么简单。 我问过我的老
我正在尝试向以下内容添加 jal 功能,但我对它的工作原理感到困惑。我知道它将旧的 PC+4 值存储在 $ra 寄存器中,然后将控制权转移到函数,该函数通过 return $ra 传回控制权 但是如何
我正在学习如何执行 MIPS,但我对乘法感到困惑。假设我正在将以下 C 代码转换为 MIPS。 c = b + a*3 a,b,c分别存放在寄存器$s1,$s2,$s3中。我应该如何在 MIPS 中编
我正在为明天的考试而学习,并且我对加载/存储字节主题感到困惑。我有这个例子: 我完全不明白他是怎么得到红色答案的。有人可以帮我解释一下吗? 最佳答案 add $s3, $zero, $zero
我不明白如何翻译标签。任何人都可以给我一个帮助 假设我们有以下代码: loop: add $t2,$t2,$t1 addi $t2,$t2,4 sw $t2,4($s0)
当我阅读 MIPS 架构时,我遇到了影子寄存器,据说它们是通用寄存器的副本。 我无法理解以下内容:何时使用影子寄存器? 最佳答案 MIPS 影子寄存器用于减少处理中断时的寄存器加载/存储开销。分配了影
您好,我想让 hello world 输出用户输入的次数,比如如果他们写了 3 ,那么 hello world 将被打印 3 次。我该怎么做呢?这是我目前正在使用的: .data n:
我正在使用 MARS MIPS 模拟器,我想在我的程序中打印一个换行符。 .data space: .asciiz "\n" .text addi $v0, $zero, 4 # print
我是一名优秀的程序员,十分优秀!