Estoy tratando de escribir una versión x86 del programa 'cat' como un entrenamiento de llamadas syscall en ensamblaje.
Estoy luchando mucho con los argumentos de la línea de comandos. Uso el símbolo principal como punto de entrada, así que pensé que encontraría el parámetro argc en %rdi y el parámetro argv en %rsi. En realidad, argc está en %rdi como se esperaba, pero sigo fallando en el segmento cuando intento pasar argv[1] a la llamada al sistema abierta.
No estoy seguro de lo que estoy haciendo mal, aquí está mi código de ensamblaje:
main: cmp $2, %rdi // If argc != 2 return 1 jne .err1 lea 8(%rsi), %rdi // Move argv[1] -> %rdi xor %rsi, %rsi // 0 to %rsi -> O_RDONLY xor %rdx, %rdx mov $2, %rax // Open = syscall 2 syscall cmp 0, %rax // If open returns <0 -> exit status 2 jl .err2 mov %rax, %rdi // Move fd to %rdi call cat ret .err1: mov $1, %rax ret .err2: mov $2, %rax retHay dos problemas con su código.
Primero, usa lea 8(%rsi), %rdi para recuperar el segundo argumento. Tenga en cuenta que rsi apunta a una matriz de punteros a los argumentos de la línea de comandos, por lo que para recuperar el puntero al segundo argumento, debe quitar la referencia a 8(%rsi) usando algo como mov 8(%rsi), %rdi .
En segundo lugar, olvidó el signo de dólar delante del 0 en cmp $0, %rax . Esto hace que se seleccione un modo de dirección absoluta para la dirección 0 , eliminando efectivamente la referencia a un puntero nulo. Para solucionar esto, agregue el signo de dólar que falta para seleccionar un modo de direccionamiento inmediato.
Cuando soluciono ambos problemas, su código, en la medida en que lo publicó, parece funcionar bien.