Assembly 如何在汇编语言(MIPS)中实现小于或等于?
我面前有一个C代码,我必须将它翻译成MIPS汇编语言 我不是在寻找一个直接的答案,但我希望有人纠正我对这个问题的思考方式 我面前的C代码是:Assembly 如何在汇编语言(MIPS)中实现小于或等于?,assembly,mips,Assembly,Mips,我面前有一个C代码,我必须将它翻译成MIPS汇编语言 我不是在寻找一个直接的答案,但我希望有人纠正我对这个问题的思考方式 我面前的C代码是: x = ((++z)<=y); x=(++z)正如Michael所指出的,标签应该如下所示: addi $8,$8,1 slt $1,$8,$7 beq $8,$7,Label addi $t0,$0,1 Label ori $6,$t0,$1
x = ((++z)<=y);
x=(++z)正如Michael所指出的,标签应该如下所示:
addi $8,$8,1
slt $1,$8,$7
beq $8,$7,Label
addi $t0,$0,1
Label ori $6,$t0,$1
有趣的是,您使用的是slt
,而不是seq
,为什么不呢?您可能可以这样做:
addi $8,$8,1
slt $1,$8,$7
seq $t0,$8,$7
ori $6,$t0,$1
通过避免分支,程序可以稍微快一点(假设这种情况发生多次)。像往常一样,询问编译器(例如)。另请参见
跳到下一条指令几乎在任何情况下都是毫无意义的。beq$8,$7,Label
/Label…
那么你建议做什么?我的建议是,在编写代码时,你应该记住,分支到下一条指令是毫无意义的,因为下一条指令无论如何都会到达操作(不管分支是否有条件)。啊哈,我想我知道从这里走到哪里。感谢MIPSSLT
指令,如果条件为真,则将目标寄存器设置为1,否则将其设置为零。MIPS(MIPS32R2)没有SEQ
指令。您可能正在考虑条件移动:MOVZ
,但MIPS火星模拟器不支持这一点。我非常确定slt
指令在SGI MIPS处理器上返回255为真……我在当前文档中看到它说1。参考:
addi $8,$8,1
slt $1,$8,$7
seq $t0,$8,$7
ori $6,$t0,$1
int booleanize_le(int y, int z){
return (z<=y);
}
# GCC5.4 -O3 -fno-delayed-branch
booleanize_le(int, int):
slt $2,$4,$5 # slt retval, y, z
xori $2,$2,0x1 # !retval, i.e. flip 0 <-> 1 since it was already boolean
j $31 # return
# (omitting the NOP in the branch-delay slot)
int booleanize_inc_le_signed(int y, int z){
return ((++z)<=y);
}
booleanize_inc_le_signed(int, int):
slt $2,$5,$4 # z<y before incrementing
j $31
# increment optimized away in this function, but you'd do it with
addiu $5, $5, 1
int booleanize_inc_le_unsigned(unsigned int y, unsigned int z){
return ((++z)<=y);
}
booleanize_inc_le_unsigned(unsigned int, unsigned int):
addiu $5,$5,1 # z++
sltu $2,$4,$5 # y<z (unsigned)
xori $2,$2,0x1 # return !(y<z)
j $31
xor $2,$4,$5 # find bit-differences
sltu $2,$2,1 # (a^b) < 1U
xor $2,$4,$5
sltu $2,$0,$2 # 0U < (a^b)
sltu $2,$0,$4 # 0U < a