MIPS - 如何找到分支和跳转指令的地址值

标签 mips addressing

我马上就要考试了,我完全被这个问题困住了(见下文);即使查看模型答案也无济于事。我已经尝试阅读该主题的正文,但仍然不知道如何做到这一点。如果有人能提供该问题的分步介绍,我将不胜感激。

"Assuming the first instruction of the MIPS snippet below is located at memory address 0x10001000. What is the value for else and exit in bne and j instruction?"

1   0x10001000:   addi $s0, $0, 5
2   0x10001004:   sub $s2, $0, $s1
3   0x10001008:   beq $s0, $s2, else
4   0x1000100C:   add $s0, $0, $0
5   0x10001010:   add $t0, $s2, $s0
6   0x10001014:   j exit
7   0x10001018:   else: addi $s1, $s0, -1
8   0x1000101C:   exit:

Model Answer:

Else: 0000000000000011 Exit: 00000000000000010000000111

我还提供了指向原始问题图片的链接。 http://i.imgur.com/NgHpZXs.png

最佳答案

首先,我们将处理分支。分支是 I-Type 指令,因此分支目标以 16 位编码。找出分支的立即数字段的最简单方法是计算分支指令与其目标之间的指令数。在这种情况下,else 标签是 beq 之后的 4 指令,但是,PC 增加了 4 在指令获取阶段,所以实际的立即字段实际上是 3。当然,在二进制中,这与示例 0000000000000011 匹配。

接下来,跳转是一个 J-Type 指令,它使用地址的前 24 位对跳转目标进行编码。但是,因为跳转目标必须是字对齐的,所以最后两位将始终为 0,因此它们是不必要的。因此,j 指令的跳转字段匹配示例答案:0x1000101C >> 2 = 0x4000407 = 00000000000000010000000111

关于MIPS - 如何找到分支和跳转指令的地址值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23727105/

相关文章:

css - 在 Flex : Buttons in RichTextEditor only? 的 CSS 中寻址

assembly - 高内存地址与低内存地址和分支

assembly - 无效的程序计数器值 : 0

c - Simpletron 机器和间接寻址

python - PyCUDA内存寻址: Memory offset?

ip - IP地址和MAC地址有什么区别?

为 Mips 架构编译 C

C 到 MIPS 汇编语言

arrays - MIPS addi 指令到数组基数

c - C中struct类型的一维变量会变成二维变量吗