Bijvoorbeeld in deze code:
#display message
li $v0, 4
la $a0, Message
#promt user to enter name
li $v0, 8
la $10, username
li $a1, 20
syscall
#display the name
li $v0, 4
la $a0, userName
syscall
Ik ben erg in de war over wat li
(onmiddellijk laden) en la
(adres laden) werkelijk betekenen.
Antwoord 1, autoriteit 100%
Ze lijken redelijk op elkaar, aangezien beide (meestal) worden gebruikt voor het laden van directe waarden. Beide zijn ook pseudo-instructies, dus het is aan elke assembler die ze ondersteunt om te bepalen hoe ze precies moeten werken.
li
staat voor Load Immediate en is een handige manier om een direct bestand van maximaal 32 bits te laden. Instructies zoals addi
en ori
kunnen alleen 16-bits instants coderen, dus de assembler kan li
in meerdere instructies vertalen.
Bijvoorbeeld li $t0,0x12345678
kan worden:
lui $at, 0x1234
ori $t0, $at, 0x5678
Het is dus gewoon een manier om u te behoeden voor het schrijven van die twee instructies, en in plaats daarvan door de assembler dat voor u uit te laten werken.
Er is echt geen reden waarom b.v. li $t0, Message
wordt niet ondersteund, omdat labels ook onmiddellijk zijn, maar sommige assemblers accepteren mogelijk geen labels voor li
.
la
staat voor Load Address. Het kan worden gebruikt om integer-constanten te laden, net als li
, b.v. la $t0,0x1234678
. Maar het werkt ook met labels: la $t0, Message # t0 = address of Message
.
Sommige assemblers kunnen je ook dingen laten doen als la $t0, 8($t1) # t0 = t1 + 8
.
Wanneer je li
zou gebruiken en wanneer je la
zou gebruiken, hangt af van de context. Als de waarde die u laadt als adres wordt gebruikt, gebruikt u doorgaans la
om deze te laden, en anders gebruikt u doorgaans li
. Omdat ze gedeeltelijk uitwisselbaar zijn, is het aan jou, maar andere mensen zullen je code misschien vreemd vinden als je de hele tijd la
gebruikt om integer-constanten te laden.