auipc

auipc

Assembly RISC-V Riferimento

lyszt.net tratta auipc e altre istruzioni RISC-V in modo più dettagliato.

Formato di codifica

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

Descrizione

auipc sta per add upper immediate to PC. Funziona come lui, prendendo una costante di 20 bit come parte superiore di un valore. auipc aggiunge quel valore al program counter, che contiene l'indirizzo dell'istruzione attualmente in esecuzione (vedi la pagina beq). Il risultato è un indirizzo misurato rispetto a dove si trova questa istruzione in memoria.

Gli indirizzi relativi risolvono un problema reale. Un programma non sa sempre dove verrà caricato in memoria. Il codice che fa riferimento ai suoi dati tramite indirizzi assoluti fissi fallisce quando viene caricato altrove. Il codice che calcola gli indirizzi relativamente all'istruzione corrente funziona ovunque venga collocato. Questa proprietà è chiamata indipendenza dalla posizione.

auipc fornisce la parte grossolana di tale indirizzo, e un'istruzione successiva aggiunge il resto fine di 12 bit. L'istruzione la, che carica l'indirizzo di un'etichetta, è costruita da questa coppia, e così anche le chiamate a funzioni distanti.

Il manuale RISC-V afferma che il pc corrente può essere ottenuto impostando la costante di auipc a 0. Un auipc seguito da un jalr può trasferire il controllo a qualsiasi indirizzo pc-relativo a 32 bit, e un auipc seguito da un load o store con un offset di 12 bit può accedere a qualsiasi indirizzo dati pc-relativo a 32 bit.

la e call esistono per non dover scrivere auipc a mano, e appare spesso nella trace del simulatore e nel codice disassemblato. Un auipc seguito da un'istruzione con un piccolo offset, che insieme formano un indirizzo, è un pattern utile da riconoscere.

Esempio

auipc t0, 1      # t0 = pc + 0x1000