Frage Laden Sie die 32-Bit-Konstante, um sie in MIPS zu registrieren


Ich war verwirrt über diesen Teil, während ich MIPS studierte.

Das Lehrbuch von Professor John L. Hennessy sag, wenn wir welche bekommen groß konstant zu laden, sollten wir

lui $s0, upper(big)
ori $s0, $s0, lower(big)

Aber warum tun wir das nicht einfach?

addi $s0, $zero, big

Da die Register 32-Bit sind, ist dies strikter, oder?


5
2017-10-31 15:03


Ursprung


Antworten:


Das unmittelbare Argument wurde übergeben addi ist nur 16 Bits. Um einen 32-Bit-Sofortwert zu laden, der außerhalb des Bereichs eines 16-Bit-Wertes liegt, müssen Sie dies in zwei Schritten tun, wie im Beispiel aus Ihrem Lehrbuch.

(Eine weitere Frage vorwegnehmend, der Grund, warum es keine unmittelbare Ladeoperation gibt oder eine unmittelbare Anweisung, die einen 32-Bit-Sofortwert annimmt, hat, weil die MIPS-ISA 32-Bit-Befehle fester Größe verwendet, so dass immer <32 Bits für alle Befehlsargumente verfügbar sind ist in RISC-Architekturen sehr häufig.)


5
2017-10-31 15:06



Ja Register sind 32-Bit, aber wie können Sie eine 32-Bit-Nummer in einer Anweisung angeben, die 32 Bit ist? Eine Anweisung besteht aus Opcode und Daten. Sie können also keine Opcode + 32-Bit-Daten in einem einzigen Addi komprimieren.


3
2017-10-31 15:07



Sie können den Literalpool verwenden, wenn Sie viele Konstanten laden müssen. Dann kostet jede konstante Ladung nur 1 Ladeanweisung. Mehr Informationen Hier und Hier


0
2017-08-01 13:52



Alternativ mit .Daten und .Text

.data
   word32bits: .word 0xFFFFFFFF

.text
   lw $t0, word32bits # $t0 now contains your 32 bit word.

0
2018-03-29 02:39