Tengo una pregunta sobre las llamadas al sistema Linux x86 en ensamblador.
Cuando estoy creando un nuevo programa ensamblador con nasm en Linux, me gustaría saber qué llamadas al sistema debo usar para realizar una tarea específica (por ejemplo, leer un archivo, escribir resultados o simplemente salir...). Conozco algunos syscall porque los he leído en algunos ejemplos tomados en Internet (como eax=0, ebx=1 int 0x80 exit con valor de retorno de 1), pero nada más... ¿Cómo podría saber si hay otros? argumentos para salir de syscall? ¿O para otra llamada al sistema? Estoy buscando documentos que expliquen qué llamadas al sistema tienen qué argumentos pasar en qué registros.
He leído la página de manual sobre la función de salida, etc. pero no me explicó lo que estoy preguntando.
Espero haber sido lo suficientemente claro,
¡Gracias!
El wiki x86 (que acabo de actualizar nuevamente :) tiene enlaces a la llamada del sistema ABI (cuáles son los números para cada llamada, dónde colocar los parámetros, qué instrucción ejecutar y qué registros se eliminarán al regresar). Esto no está documentado en la página del manual porque es específico de la arquitectura. Lo mismo para las constantes binarias: no tienen que ser las mismas en todas las arquitecturas.
grep -r O_APPEND /usr/include para que su arquitectura de destino busque recursivamente los archivos .h .
Aún mejor es configurar las cosas para que pueda usar las constantes simbólicas en su fuente asm, para facilitar la lectura y evitar el riesgo de errores.
El gcc en realidad usa el preprocesador C cuando procesa archivos .S , pero incluir la mayoría de los archivos de encabezado C también le dará algunos prototipos C.
O convierta los #define s a macros NASM con sed o algo así. Tal vez alimente algunas líneas #include<> al preprocesador C y haga que imprima solo las definiciones de macro.
printf '#include <%s>\n' unistd.h sys/stat.h | gcc -dD -E - | sed -ne 's/^#define \([A-Za-z_0-9]*\) \(.\)/\1\tequ \2/p' Eso convierte cada #define no vacío en un symbol equ value NASM. El archivo resultante tiene muchas líneas de error: expression syntax error cuando intenté ejecutar NASM en él, pero seleccionar manualmente algunas líneas válidas puede funcionar.
Algunas constantes se definen en varios pasos, por ejemplo, #define S_IRGRP (S_IRUSR >> 3) . Esto podría o no funcionar cuando se convierte a definiciones de símbolos equ de NASM.
También tenga en cuenta que en C 0666 , es una constante octal. En NASM, necesita 0o666 o 666o ; un 0 inicial no es especial. De lo contrario, la sintaxis de NASM para constantes hexadecimales y decimales es compatible con C.
Tal vez esté buscando algo como linux/syscalls.h[1], que tiene en su sistema si instaló el código fuente de Linux a través de apt-get o lo que sea que use su distribución.
[1] http://lxr.free-electrons.com/source/include/linux/syscalls.h#L326