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?
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.