У меня были проблемы с 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.
Как мне получить это не ответвление:
li $a0, ','
subu $a0, $a0, 'A'
ble $a0, $0, LESS
и это до ответвление:
li $a0, 'B'
subu $a0, $a0, 'A'
ble $a0, $0, LESS