Assembly 如何将嵌套的If/AND语句转换为MIPS?

Assembly 如何将嵌套的If/AND语句转换为MIPS?,assembly,mips,Assembly,Mips,作为我正在处理的类项目的一部分,必须包含调试功能。我对一些if/and语句有问题。这是我写的: /查找状态矩阵包含1的位置的上一代码/ ` 我没有得到我期望的结果,所以我的想法是代码写得不正确。任何洞察都会很棒 这计算出最小的C代码: if (debug) status = !status; 在MIPS中,这可以写入(假设s0为调试,a0为状态): 或者更详细地说 blez s0, no_debug_mode blez a0, set_status_high li a0,

作为我正在处理的类项目的一部分,必须包含调试功能。我对一些if/and语句有问题。这是我写的:

/查找状态矩阵包含1的位置的上一代码/

`
我没有得到我期望的结果,所以我的想法是代码写得不正确。任何洞察都会很棒

这计算出最小的C代码:

if (debug) 
    status = !status;
在MIPS中,这可以写入(假设s0为调试,a0为状态):

或者更详细地说

  blez s0, no_debug_mode
  blez a0, set_status_high
  li a0, 0
  j no_debug_mode
set_status_high:
  li a0, 1
no_debug_mode:
  # ...
您所发布的示例仅在其中一个值上发布了分支,并且没有使用否定,因此它将给出错误的结果。此外,在
\u debug\u mode
标签的末尾没有跳转,因此
\u else
将始终执行


我已经有一段时间没有做MIPS了。如果需要分支延迟时隙,则必须将其添加到上述两个答案中。

这将计算出最小的C代码:

if (debug) 
    status = !status;
在MIPS中,这可以写入(假设s0为调试,a0为状态):

或者更详细地说

  blez s0, no_debug_mode
  blez a0, set_status_high
  li a0, 0
  j no_debug_mode
set_status_high:
  li a0, 1
no_debug_mode:
  # ...
您所发布的示例仅在其中一个值上发布了分支,并且没有使用否定,因此它将给出错误的结果。此外,在
\u debug\u mode
标签的末尾没有跳转,因此
\u else
将始终执行


我已经有一段时间没有做MIPS了。如果需要分支延迟槽,则必须将其添加到上述两个答案中。

Real MIPS有分支延迟槽(除非使用MIPS32/64r6无延迟分支指令)。许多人在为MARS或SPIM执行MIPS作业程序时,分支延迟槽被禁用。但是问题中的语法没有使用
$a0
,只是简单的
a0
,因此它可能不是那些汇编器/模拟器中的任何一个。但是,是的,很好的回答,在这种情况下,分解出
debug==1
前提条件是可能的,从而简化了一切。否则,在一般情况下会出现重复的Q&A。e、 g.slt或任何你与AND或or组合的寄存器。谢谢你,你的回答很有帮助。@Nikki,很高兴听到这个消息。您可以考虑在答案的左边使用复选标记来接受它。请参阅Real MIPS具有分支延迟插槽(除非使用MIPS32/64r6无延迟分支指令)。许多人在为MARS或SPIM执行MIPS作业程序时,分支延迟槽被禁用。但是问题中的语法没有使用
$a0
,只是简单的
a0
,因此它可能不是那些汇编器/模拟器中的任何一个。但是,是的,很好的回答,在这种情况下,分解出
debug==1
前提条件是可能的,从而简化了一切。否则,在一般情况下会出现重复的Q&A。e、 g.slt或任何你与AND或or组合的寄存器。谢谢你,你的回答很有帮助。@Nikki,很高兴听到这个消息。您可以考虑在答案的左边使用复选标记来接受它。看见