- 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:
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