Assembly 如何在汇编语言(MIPS)中实现小于或等于?

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

我面前有一个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
有趣的是,您使用的是
slt
,而不是
seq
,为什么不呢?您可能可以这样做:

         addi   $8,$8,1
         slt    $1,$8,$7
         seq    $t0,$8,$7
         ori    $6,$t0,$1
通过避免分支,程序可以稍微快一点(假设这种情况发生多次)。

像往常一样,询问编译器(例如)。另请参见



跳到下一条指令几乎在任何情况下都是毫无意义的。
beq$8,$7,Label
/
Label…
那么你建议做什么?我的建议是,在编写代码时,你应该记住,分支到下一条指令是毫无意义的,因为下一条指令无论如何都会到达操作(不管分支是否有条件)。啊哈,我想我知道从这里走到哪里。感谢MIPS
SLT
指令,如果条件为真,则将目标寄存器设置为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