MIPS с использованием разных типов регистров, но с одинаковым решением - PullRequest
0 голосов
/ 31 мая 2019

Мне интересно, есть ли разница, когда вы используете другой регистр, такой как код ниже:

Здесь правильный ответ использует регистр $v0 полностью:

get_status:
        lui $t0,0xabab
        ori $t0, $t0, 0x0020

        lw $v0,0($t0)
        andi $v0,$v0,0x4
        srl $v0,$v0,2

        jr $ra

Iиспользовал $t1 вместо $v0 выше, обратите внимание, у меня есть дополнительные sw:

get_status:
        lui $t0,0xabab
        ori $t0, $t0, 0x0020

        lw $t1,0($t0)
        andi $t1,$t1,0x4
        srl $t1,$t1,2
        sw $t1, 0($t0)

        jr $ra

Я думаю, что оба кода работают одинаково, что вы, ребята, думаете?

1 Ответ

0 голосов
/ 31 мая 2019

$v0 и $t1 оба являются целочисленными регистрами общего назначения.Они не "разные типы".

Но в стандартном соглашении о вызовах MIPS, $v0 (а иногда и $v1) - это то, где вызывающие ожидают найти целочисленные возвращаемые значения.Вот почему get_status вычисляет результат в $v0.

Я думаю, что оба кода работают одинаково, как вы думаете, ребята?

Ваш код изменяет статическое хранилищечто он загрузил с !!!Это уже не get_status.

Это либо void update_status(void), либо int update_status(void) с нестандартным соглашением о вызовах (возвращается $t1).


Это неэффективно:

lui ...
ori $t0, $t0, 0x0020
lw  $v0,0($t0)

Используйте пространство немедленного смещения lw для хранения младших 16 бит статического адреса.(Это знак расширенный, против ori немедленное продление нуля, но в этом случае вам не нужно корректировать lui, потому что смещение имеет положительный знак.)

lui ...
lw  $v0, 0x0020($t0)
...