Decidí probar el ensamblado el otro día, y he estado jugando con cosas realmente básicas como imprimir cosas desde argv hasta stdout. Encontré esta gran lista de números de llamada al sistema de Linux con argumentos y todo, y tengo curiosidad por qué r10 se usa para argumentos antes de r8 y r9 . He encontrado todo tipo de convenciones extrañas sobre qué se puede usar, qué, para qué y cuándo, como cómo van los contadores de bucle en rcx . ¿Hay alguna razón en particular por la que se subió r10 ? ¿Era más conveniente?
Probablemente también debería mencionar que estoy interesado en esto por curiosidad, no porque me esté causando problemas.
Editar: encontré esta pregunta que se acerca, haciendo referencia a la documentación de ABI x64 en la página 124, donde señala que las aplicaciones de nivel de usuario usan rdi, rsi, rdx, rcx, r8, r9 . El núcleo, por otro lado, usa r10 en lugar de rcx y destruye rcx y r11 . Eso podría explicar cómo r10 terminó allí, pero ¿por qué se intercambió?
RCX , junto con R11 , es utilizado por la instrucción syscall , siendo inmediatamente destruido por ella. Por lo tanto, estos registros no solo no se guardan después de la llamada al sistema, sino que ni siquiera se pueden usar para pasar parámetros. Por lo tanto, se eligió R10 para reemplazar RCX inutilizable para pasar el cuarto parámetro.
Consulte también esta respuesta para obtener un poco más de información sobre cómo syscall usa estos registros.
Referencia: Referencia del conjunto de instrucciones de Intel , busque SYSCALL .
consulte la documentación de x86-64.orgs abi en la page 124
Las aplicaciones de nivel de usuario se utilizan como registros enteros para pasar la secuencia %rdi, %rsi, %rdx, %rcx, %r8 y %r9. La interfaz del núcleo utiliza %rdi, %rsi, %rdx, %r10, %r8 y %r9.
Una llamada al sistema se realiza a través de la instrucción syscall. El núcleo destruye los registros %rcx y %r11.
Esto significa que cuando usa la instrucción syscall, el núcleo destruye %rcx , por lo que necesita usar %r10 en su lugar.
Además, el comentario de @technosaurus explica que el kernel está usando %rcx para almacenar el punto de entrada en caso de una interrupción durante una llamada al sistema.