Вычитание без знака, значение по-прежнему считается меньше 0 - PullRequest
0 голосов
/ 23 октября 2018

У меня были проблемы с 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
...