将 C 转换为 MIPS
Converting C to MIPS
我正在用 MIPS 编写程序,但无法全神贯注地编写下面的语句。如何在 MIPS 指令集中编写这样的逻辑语句?
return a > b ? a : b;
return
: return 给被调用者一些价值(如果表达式存在)。
A ? B : C
:这是条件运算符。如果 A
为真(非零),则计算 B
。否则,计算 C
。
如果a
和b
是有符号的32位整数,应该是这样的:
# assuming
# a = $t0
# b = $t1
# return value = $v0
slt $t2, $t1, $t0 # $t2 = (b < a)
beq $t2, $zero, nottrue # if (!(a > b)) goto nottrue
addui $v0, $t0, $zero # return value = a (not harmful even if executed when jump is taken)
jr $ra # return
sll $zero, $zero, 0 # nop: prevent instruction after branch from being executed
nottrue:
addui $v0, $t1, $zero # return value = b
jr $ra # return
sll $zero, $zero, 0 # nop: prevent instruction after branch from being executed
首先把它分解成简单的 if 语句,MIPS 是一种汇编语言,所以如果它们很复杂,所有这些都将不起作用,请记住,你的大脑不是编译器,所以尽量不要编写复杂的代码。
我正在用 MIPS 编写程序,但无法全神贯注地编写下面的语句。如何在 MIPS 指令集中编写这样的逻辑语句?
return a > b ? a : b;
return
: return 给被调用者一些价值(如果表达式存在)。A ? B : C
:这是条件运算符。如果A
为真(非零),则计算B
。否则,计算C
。
如果a
和b
是有符号的32位整数,应该是这样的:
# assuming
# a = $t0
# b = $t1
# return value = $v0
slt $t2, $t1, $t0 # $t2 = (b < a)
beq $t2, $zero, nottrue # if (!(a > b)) goto nottrue
addui $v0, $t0, $zero # return value = a (not harmful even if executed when jump is taken)
jr $ra # return
sll $zero, $zero, 0 # nop: prevent instruction after branch from being executed
nottrue:
addui $v0, $t1, $zero # return value = b
jr $ra # return
sll $zero, $zero, 0 # nop: prevent instruction after branch from being executed
首先把它分解成简单的 if 语句,MIPS 是一种汇编语言,所以如果它们很复杂,所有这些都将不起作用,请记住,你的大脑不是编译器,所以尽量不要编写复杂的代码。