在 MIPS 中检查数字是否不为零

Checking if a number is not equal to zero in MIPS

我目前正在尝试将一个 do - while 循环从 C 翻译成 MIPS,但在涉及分支测试时我有点困惑。

我试图从 C 语言转换成 MIPS 的代码如下:

do{

      code
} while(x != 0) 

我已声明以 mips 为单位

loop: 
         #code

# and down here I should be translating while(x != 0)

如何使用分支语句最有效地转换 while(x != 0)?看到一次 x == 0,do while 循环停止。

每个结构化语句都有一个汇编语言的 if-goto 风格的翻译。

当条件在高级语言中的意义与分支相反,即继续时,通常需要反转条件。

为了明白我的意思,让我们先看看 while 循环。

while ( condition ) 
    body

condition的意思是与接下来出现的正文的延续。

在if-goto风格中,我们唯一能做的就是跳出循环,所以我们必须反转condition,即! (condition).

    if ( ! condition ) goto LoopExit;
    body
LoopExit:

(if-goto 结构需要在留在循环和退出循环之间做出选择——我们不能“分支”留在循环中,所以唯一的选择是分支退出并掉入循环循环。)

由于 do while 的含义和 if-goto 的含义相同,因此测试条件与 C 中的相同。这是因为两者都将控制流更改回循环顶部。

有关将结构化语句转换为程序集的 if-goto 样式的更多信息,请参阅本文。

https://erikeidt.github.io/Transforming%20Structured%20Statements%20into%20Assembly%20Language