Notas de estudio del ensamblaje del brazo (ocho): uso de registros


  • En el programa, podemos usar 14 de los 16 registros generales para guardar nuestros propios datos, r13 y r15 son registros sp y pc, no podemos usarlos.

  • ATPCS especifica que el puntero de la pila debe estar alineado con 8 bytes.

  • ATPCS estipula que la función llamada debe garantizar que el contenido de r4-r11 permanezca sin cambios antes y después de la ejecución, es decir, la función llamada debe guardar r4-r11 antes de comenzar y restaurarla antes de regresar. Como se muestra a continuación:


Puede usar la siguiente plantilla para guardar:

routine_name
                    STMFD sp!, {r4-r12, lr} ; stack saved registers
                    ; body of routine
                    ; the fourteen registers r0-r12 and lr are available
                    LDMFD sp!, {r4-r12, pc} ; restore registers and return
El r12 se guarda para la alineación del puntero de la pila de 8 bytes.

  • ATPCS estipula que durante las llamadas a funciones, r0-r3 se utilizan para pasar parámetros, y se guardan más de 4 parámetros en la pila. El valor de retorno debe almacenarse en r0.

  • Para instrucciones push y pop de registro múltiple, como LDM y STM, los números de registro en la lista de registros deben estar en orden ascendente.

  • Las instrucciones de carga y almacenamiento de doble palabra, LDRD y STRD, los registros de operando son dos registros adyacentes, Rd y Rd + 1, y el número de registro de este Rd debe ser un número par.
  • Utilice nombres de registro en lugar de números de registro físicos al escribir rutinas de ensamblaje, lo que facilita la reasignación de registros y el mantenimiento del código.
  • Para guardar registros, podemos almacenar algunas variables con relativamente pocos dígitos en un registro, y luego podemos sacar las variables correspondientes a través de la operación shift. Vea el siguiente ejemplo:
sample = table[index];
index += increment;
En circunstancias normales, el índice y el incremento no excederán los 16 bits, podemos almacenarlos en el mismo registro, como se muestra a continuación

El código C anterior se puede implementar con el siguiente código de ensamblaje:

LDRB sample, [table, indinc, LSR#16] ; table[index]
ADD indinc, indinc, indinc, LSL#16 ; index+=increment




Publicado 60 artículos originales · Me gusta 44 · Visitas 340,000+

Supongo que te gusta

Origin blog.csdn.net/beyond702/article/details/52241376
Recomendado
Clasificación