我今天遇到了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