Qual é a diferença entre la e li em opcodes em MIPS?

por exemplo neste código:

#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

Estou muito confuso sobre o que li (Carga Imediata) e la(carga endereço) realmente significa?

Author: Michael, 2018-01-18

1 answers

Eles são bastante semelhantes, pois ambos são (principalmente) usados para carregar valores imediatos. Ambas são também pseudo-instruções , por isso cabe realmente a cada montador que as suporta determinar exatamente como elas devem funcionar.


li significa Carga Imediata e é uma maneira conveniente de carregar um imediato até 32 bits de tamanho. Instruções como addi e ori só podem codificar imediatamente 16 bits, por isso o montador pode traduzir li em múltiplos instrucao.

Por exemplo, li $t0,0x12345678 pode tornar-se:

lui $at, 0x1234 
ori $t0, $at, 0x5678        
Então é apenas uma maneira de te salvar de escrever essas duas instruções, e em vez disso deixar a montadora resolver isso para ti.

Realmente não há razão para por exemplo li $t0, Message não ser suportado, uma vez que os rótulos também são imediatos, mas alguns montadores podem não aceitar rótulos para li.


la significa endereço de carga. Pode ser usado para carregar constantes inteiras como li, por exemplo la $t0,0x1234678. Mas também funciona com etiquetas: la $t0, Message # t0 = address of Message.
Alguns montadores também podem permitir que você faça coisas como la $t0, 8($t1) # t0 = t1 + 8.


Quando se usa li e quando se usa la depende do contexto. Se o valor que você está carregando vai ser usado como um endereço você normalmente usaria la para carregá-lo, e caso contrário você usaria tipicamente li. Uma vez que são parcialmente permutáveis, depende de você, mas outras pessoas podem achar o seu código estranho-looking se você usar la todo o tempo para carregar constantes inteiras.

 4
Author: Michael, 2018-01-18 07:56:42