auipc

auipc

Ensamblador RISC-V Referencia

lyszt.net cubre auipc y otras instrucciones RISC-V con más detalle.

Formato de codificación

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

Descripción

auipc significa add upper immediate to PC. Funciona como lui, tomando una constante de 20 bits como la parte superior de un valor. auipc suma ese valor al contador de programa, que contiene la dirección de la instrucción que se está ejecutando actualmente (véase la página de beq). El resultado es una dirección medida en relación con la posición de esta instrucción en memoria.

Las direcciones relativas resuelven un problema real. Un programa no siempre sabe dónde se cargará en memoria. El código que hace referencia a sus datos mediante direcciones absolutas fijas falla cuando se carga en otro lugar. El código que calcula direcciones relativas a la instrucción actual funciona dondequiera que se coloque. Esta propiedad se denomina independencia de posición.

auipc proporciona la parte gruesa de dicha dirección, y una instrucción siguiente suma el resto fino de 12 bits. La instrucción la, que carga la dirección de una etiqueta, se construye a partir de este par, y también lo hacen las llamadas a funciones distantes.

El manual de RISC-V dice que el pc actual se puede obtener estableciendo la constante de auipc en 0. Un auipc seguido de un jalr puede transferir el control a cualquier dirección relativa al pc de 32 bits, y un auipc seguido de una carga o almacenamiento con un desplazamiento de 12 bits puede acceder a cualquier dirección de datos relativa al pc de 32 bits.

la y call existen para que no tengas que escribir auipc a mano, y aparece a menudo en la traza del simulador y en el código desensamblado. Un auipc seguido de una instrucción con un desplazamiento pequeño, formando juntos una dirección, es un patrón útil de reconocer.

Ejemplo

auipc t0, 1      # t0 = pc + 0x1000