【问题标题】:MIPS and bytes explanationMIPS和字节解释
【发布时间】:2016-09-17 15:57:15
【问题描述】:

这 3 个问题是我在课堂上唯一没听懂的问题。我的教授很糟糕,在解释材料时根本不清楚,这就是我必须来这里的原因。我有一些答案,但我不知道他们是否正确。非常感谢您,非常感谢您花时间阅读。

  1. 给出汇编指令以便:

a) 仅使用逻辑移位来隔离 $s0 中单词的字节 1。

b) 对寄存器 $t0 的低 12 位进行补码,但保持所有其他位不变。如果可能,请使用立即格式指令。如果不能使用立即格式指令,请解释原因并改用屏蔽寄存器。

c) 屏蔽 R-Format 指令的移位量并清除其余位。如果可能,请使用立即格式指令。如果不能使用立即格式指令,请解释原因并改用掩码寄存器。


  1. 此代码用于问题 2a

循环: slt $t2, $t0, $t0

   bne $t2, $zero, loop

   j done

完成:

a) bne的地址是400,给出它的目标地址。


  1. 给定汇编指令 beq $t1, $t2, Next

a) 如果指令的地址是 800 字节并且 Next 在目标地址 680 字节。指令二进制表示的偏移字段的值是多少?以十进制和二进制给出偏移值。


我的回答:

1a。 sll $t0, $s0, 16 srl $t1, $t0, 24

b. xori(无法弄清楚其余的)

c。安迪 $t0, $s1, 0x07c0

2a。 424 (400 + 4) + (4 * 3) = 416

b.

3a。我认为你必须做800-680,但我不确定。我所知道的是,当以二进制形式写入时,偏移值必须为 16 位。

【问题讨论】:

  • 有免费的 MIPS 模拟器,如 SPIM 和 MARS,您可以使用它们来验证您的答案。
  • 我明白了。但我想知道如何手工而不是使用模拟器。

标签: assembly byte mips


【解决方案1】:

1a 是错误的,如果您不移动相同的数量,它就不可能是正确的。左移 24 位以清除高 24 位,然后右移 24 位以将低字节返回到它的位置。

1b 将是 xori 0xfff 但是指令中的 12 位立即数会自动进行符号扩展,因此这实际上意味着 xori 0xffffffff 这不是您想要的。这就是你需要使用掩码寄存器的原因。

1c 是正确的

2a loop 显然就在 bne 之前,所以地址必须是 bne-4=396

3a 是的 800-680 但你需要考虑到 PC 已经更新并且偏移量是用文字编码的事实,所以你需要除以 4 得到 (800-680)/4-1=29

【讨论】:

  • 非常感谢您的回复。对于 1a,这是否意味着它应该是... sll $t0, $s0, 24 srl $t0, $s0, 24。对于 3a,你说除以 4,但你做了 4-1,那就是3. 我在这方面有点迷失。
  • 1a 是的,但为什么要使用 2 个不同的寄存器? 3a 你知道除法优先,对吧?那就是除以 4,然后减去 1,因为 PC 已经指向下一条指令(下一个字)。
  • 对于 1a,是否只是 sll $t0, $s0, 24。对于 3a,假设指令的地址为 320 字节,而 Next 位于目标地址 550 字节。那会是 (550-320)/4-1 = 56.5 吗?我为不断的问题道歉。再说一次,我的老师不擅长解释这些事情。
  • 不知道为什么要介绍$t0。应该是sll $s0, $s0, 24; srl $s0, $s0, 24。你不能在地址550 有一条指令,因为那不是字对齐的。
  • 明白了,3a 现在很清楚了。我的最后一个问题是这个。如果 1a 说:仅使用逻辑移位来隔离 $s0 中单词的字节 3 或 4(例如)。答案是否仍然是 sll $s0, $s0, 24; srl $s0, $s0, 24?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
  • 2018-10-08
相关资源
最近更新 更多