Instrução MIPS: lw (carregar palavra)
é lw $s0,8($0)
o mesmo que lw $s0,0($v0)
?
não vejo a diferença. Eu acho que o 8 representa o offset, o que significa que precisamos dos addres de $0 e adicionar 2 (8/4) para o endereço.
editar:
A minha pergunta é sobre a instrução lw e o conjunto de registos MIPS. É muito difícil para mim entender como a compensação funciona exatamente...1 answers
lw
é o seguinte:
lw RegDest, Offset(RegSource)
Onde o RegDest e o RegSource são registos MIPS, e o Offset é imediato.
Significa, introduzir no registo RegDest a palavra contida no endereço resultante da adição do conteúdo do registo RegSource e da compensação especificada. O endereço de origem resultante deve ser alinhado com as palavras (ou seja, múltiplo de 4)
Portanto,
lw $s0,8($0)
significa carregar em $s0
o conteúdo da palavra localizado no endereço indicado por $0
mais 8. Como $0
é o registo $zero
que irá sempre conter o zero constante, irá carregar a palavra localizada no endereço absoluto 8 em $s0
.
lw $s0,0($v0)
meios para carregar em $s0
o conteúdo da palavra localizado no endereço especificado por $v0
. Se $v0
contém o valor 8 então ambas as instruções têm o mesmo efeito. Se $v0
não for um múltiplo de 4, o a instrução irá gerar uma Armadilha de endereçamento.
Geralmente lw
é uma pseudoinstrução no sentido de que o montador pode emmit mais de uma instrução para realizar a instrução. O deslocamento (deslocamento) tem que ser um valor assinado de 16 bits.
Se a sua instrução tem um imediato com mais bits, o montador usualmente usa um registro temporário ($at
) para manter o conteúdo do imediato e, em seguida, emmit instruções equivalentes para realizar o comportamento pretendido. Pode ver isto. in action using a dissassembler or a MIPS monitor (also inspecting the code with MARS simulator).