无符号减法,值仍然小于0

时间:2018-10-22 21:58:03

标签: c assembly mips integer-arithmetic

我今天遇到了MIPS的麻烦。

我想做些聪明的事情,然后重新编写这个复杂的if语句:

if (c >= 'A' && c <= 'Z')

if ((unsigned) (c-'A') <= ('Z'-'A'))

这里的C符合我的预期:

#include <stdio.h>

int main(void) {
  char c = ',';
  if ((unsigned) c - 'A' <= 0) {
    putchar('~');
  }
  putchar('.');
  return 0;
}

如何在MIPS中编写该代码?


我的尝试没有达到我的预期。

MIPS似乎认为(unsigned) 44 - 65(例如)小于0

这是我的问题的最小,完整和可验证的示例:

        .text
        .globl main

main:
        li $a0, ','
        subu $a0, $a0, 'A'
        ble $a0, $0, LESS
        j END
LESS:
        li $a0, '~'
        li $v0, 11
        syscall
        j END
END:
        li $a0, '.'
        li $v0, 11
        syscall
        li $v0, 10
        syscall

我希望它仅输出.,因为在此之后

li $a0, ','
subu $a0, $a0, 'A'

我希望$a0包含一些大的正整数(我认为subu是无符号的减法?)。

但是ble $a0, $0, LESS分支,证明未签名的',' - 'A'(或44 - 65)显然小于0。


如何将其发送到 not 分支:

li $a0, ','
subu $a0, $a0, 'A'
ble $a0, $0, LESS

和此 to 分支:

li $a0, 'B'
subu $a0, $a0, 'A'
ble $a0, $0, LESS

0 个答案:

没有答案