la
pseudolyszt.net aborda la e outras instruções RISC-V com mais detalhes.
Descrição
la carrega o endereço de algo em um registrador. Esse endereço é um local de memória, e o valor armazenado nesse local é uma coisa separada. O nome significa load address (carregar endereço).
Quando você reserva dados na memória, você dá a eles um nome como arr ou msg, o que evita que você tenha que acompanhar números de endereços brutos. Esse nome é um rótulo, um substituto legível para um endereço de memória. A linha seguinte carrega o endereço marcado pelo rótulo arr em t0. Ela fornece o local onde o array começa e não lê o conteúdo do array.
la t0, arr
As instruções de carga e armazenamento (lw, sw e as demais) recebem um endereço contido em um registrador. Antes de você poder ler ou escrever dados nomeados, o endereço deles precisa estar em um registrador, e la o coloca lá. Ler o valor exige duas instruções. la encontra onde os dados estão, e lw lê o que está lá.
O manual do RISC-V descreve auipc como a instrução para construir endereços relativos ao pc. Ele afirma que um auipc seguido de uma carga ou armazenamento com um deslocamento de 12 bits pode alcançar qualquer endereço de dados relativo ao pc de 32 bits.
Um endereço e seu conteúdo diferem da mesma forma que um ponteiro e um valor diferem. Depois que o endereço está em um registrador, você acessa elementos individuais adicionando deslocamentos a ele. O exemplo carrega o endereço de um trecho de texto em a0, que é o que o serviço de impressão de string exige. Ele precisa saber onde o texto está, e lê o texto a partir dali. la é uma pseudoinstrução que o montador constrói a partir de algumas instruções reais.
Expande para
auipc rd, hi(label) addi rd, rd, lo(label)
O montador substitui esta pseudoinstrução pela instrução ou instruções reais listadas acima.
Exemplo
.data msg: .string "hi" .text la a0, msg # a0 = address of msg
