MIPS: lw (laad woord) instructie

Is lw $s0,8($0)hetzelfde als lw $s0,0($v0)?

Ik zie het verschil niet. Ik denk dat de 8 de offset vertegenwoordigt, wat betekent dat we het adres van $ 0 nodig hebben en 2 (8/4) aan het adres toevoegen.

BEWERKEN:

Mijn vraag gaat over de lw-instructie en de MIPS-registerset. Het is vrij moeilijk voor mij om te begrijpen hoe de offset precies werkt…


Antwoord 1, autoriteit 100%

Ze zijn niet hetzelfde, hoewel ze zich in sommige omstandigheden hetzelfde zullen gedragen.
Het formaat van de lwinstructie is als volgt:

lw RegDest, Offset(RegSource)

waar RegDest en RegSource MIPS-registers zijn en Offset onmiddellijk is.

Het betekent, laad in register RegDest het woord in het adres dat resulteert uit het toevoegen van de inhoud van register RegSource en de gespecificeerde Offset. Het resulterende bronadres moet worden uitgelijnd met woorden (d.w.z. een veelvoud van 4)

Daarom,
lw $s0,8($0)betekent het in $s0laden van de inhoud van het woord dat zich bevindt op het adres gespecificeerd door $0plus 8. As $0is register $zerodat altijd de constante nul zal bevatten, het laadt het woord dat zich in absoluut adres 8 bevindt in $s0.

lw $s0,0($v0)betekent het in $s0laden van de inhoud van het woord op het adres gespecificeerd door $v0. Als $v0de waarde 8 bevat, hebben beide instructies hetzelfde effect. Als $v0geen veelvoud van 4 is, genereert de instructie een adresseringstrap.

Meestal is lween pseudo-instructie in die zin dat de assembler meer dan één instructie kan uitzenden om de instructie te volbrengen. De offset (verplaatsing) moet een 16-bits getekende waarde zijn.
Als uw instructie een onmiddellijke met meer bits heeft, zal de assembler gewoonlijk een tijdelijk register ($at) gebruiken om de inhoud van de onmiddellijke vast te houden en vervolgens equivalente instructies uitsturen om het beoogde gedrag uit te voeren. U kunt dit in actie zien met behulp van een dissassembler of een MIPS-monitor (ook de code inspecteren met MARS-simulator).

Other episodes