Notas del lector de RISCV_3 Asamblea de RISCV

lenguaje ensamblador RISC-V

imagen-20230626080943809

Los pasos de la llamada de funciones también han estado involucrados en la composición y el diseño de la computadora:

  • El registro especificado se almacena en el parámetro;
  • Saltar a la posición de inicio de la función (jal);
  • Guardar registros a pedido en destinatario;
  • ejecutar función;
  • Restaurar el registro guardado, almacenar el valor de retorno en la ubicación especificada;
  • Devuelve dónde se llamó a la función (comando ret, mips es jr).

Las variables deben almacenarse en registros tanto como sea posible debido a su velocidad. Un registro que no necesita guardar un valor durante una llamada de función (la función sobrescribe directamente el valor) se llama registro temporal; un registro que necesita guardar un valor se llama registro guardado. Las funciones que no llaman a otras funciones se llaman funciones hoja. Si la función hoja tiene menos parámetros y variables locales, se puede resolver directamente con registros; si hay demasiados, debe almacenarse en la memoria (desbordamiento de desbordamiento), pero el desbordamiento es raro.

imagen-20230626082237242

Es principalmente para guardar registros y algunos registros relacionados con operaciones de bajo nivel, como el puntero de pila sp y otros valores, que no se pueden cambiar y deben conservarse.

Ejemplo de llamada de función:

entry_label:
	addi sp,sp,-framesize	# framesize存储的是要保存的ra,保存寄存器等个数*4,因为都是32位的寄存器
	sw ra,framesize-4(sp)	# 栈顶存ra
	# 按需保存其他寄存器

	# 函数体
	
	# 按需返回其他寄存器
	lw ra,framesize-4(sp)	# 栈顶取ra 
	addi sp,sp,framesize
	ret

ensamblador

En el sistema unix, es un archivo con el sufijo .s, mientras que en el sistema ms-dos, es un archivo .asm.

En el archivo, el principio de .es un indicador. Por ejemplo, analicemos el archivo ensamblado generado por la compilación hello world:

imagen-20230626150328359

1687745922013

.text marca el comienzo de la sección de código.

.align 2 es para alinear el código en 32 bits, porque las instrucciones son todas de 32 bits.

.globl main es la función principal global.

Las cadenas son datos no modificables, por lo que se marcan con .section .rodata datos de solo lectura. También alinear los datos.

Luego use .string para identificar cadenas terminadas en \0.

El formato de archivo final generado por el ensamblador es el siguiente, que es un archivo ELF enlazable.

1687763280786

La dirección entrante de todos los registros en las líneas 8 a 1c es 0, y el valor específico se establece cuando se realiza el enlace posterior.

Enlazador

Cada archivo se puede compilar y ensamblar de forma independiente, de modo que algunos archivos se modifican sin volver a compilarlos todos, y el nuevo código se puede empalmar con los módulos de lenguaje de máquina existentes.

Los archivos unix son archivos .o -> .out, los archivos msdos son .obj .lib -> archivos .exe.

El enlazador necesita asignar el espacio de direcciones correspondiente en la figura al programa y los datos. Este paso se puede omitir si el programa es independiente de la posición (código PIC). La función de transferencia relativa de RV32I (el salto de programa es más el valor relativo) facilita la implementación de PIC.

Luego es necesario traducir la instrucción de saltar directamente a la etiqueta en el compilador a saltar a la dirección inmediata, y también se corrige el valor de jalr para saltar a la dirección inmediata jal, y los valores de dirección específicos de auipc jalr lui addi se modifican.

imagen-20230626153655941

La transmisión de número de punto flotante de RV depende de qué especificación de interfaz ABI se seleccione. ilp32 es un número de punto flotante pasado en un registro entero, ilp32f es un registro de punto flotante de precisión simple e ilp32d es un registro de punto flotante de precisión doble.

RV32I no es compatible con la extensión FD, por lo que solo puede usar ilp32. Instrucciones de compilación:GCC 选项-march=rv32i -mabi=lib32

Sin embargo, no dice que debe usarse para admitir extensiones de coma flotante, por lo que RV32IFD también puede usar ilp32 o ilp32f.

El enlazador también busca extensiones compatibles. El compilador puede admitir múltiples ABI ISA, pero será incompatible si esas bibliotecas no están instaladas en la computadora.

Enlace estático y enlace dinámico

Al vincular una función de biblioteca, si la versión actual de la función de biblioteca ya se ha vinculado, no se vinculará. Múltiples llamadas no repiten el enlace.

Además, la dirección de salto del enlace dinámico se almacena en una tabla en la memoria. La tabla de direcciones de función se actualiza cada vez que se realiza el enlace por primera vez. Al llamar, solo se necesitan tres instrucciones (instrucciones de código auxiliar) para buscar la tabla para encontrar la posición de salto correspondiente y luego salta.

epílogo

El registro 0 facilita la implementación de algunos pseudocódigos;

lui auipc es diferente de la forma de instrucción compleja que combina dos direcciones de 16 bits en el pasado, desplazamiento a la izquierda de 20 bits + 12 bits para obtener la dirección más rápido, reducir la cantidad de instrucciones y auipc es fácil de manejar PIC;

PIC reduce la complejidad del enlace (independiente de la posición);

Un gran número de registros agiliza la operación.

Supongo que te gusta

Origin blog.csdn.net/jtwqwq/article/details/131401555
Recomendado
Clasificación