Hola a todos, esta vez he querido leer un caracter de stdin pero hay segmentation fault, es porque alamaceno lo leido en esi y no soy capaz de derteminar la length de este para darselo al sys_write, es basicamente un programa de echo:
section .text
global _start ;parida que necesita el linker xD
_start: ;entry point
pop ebx
pop ebx
pop ebx
pop ebx
mov eax,5
add ebx,ecx
mov edx,len ;Longitud del mensaje
mov ecx,msg ;Mensaje que vamos a escribir
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;llama de sistema numero 4 (sys_write)
int 80h ;call al kernel para que ejecute las sentencias
pushad ;Guardamos registros
pushfd ;Guardamos flags
mov eax, 3 ;sys_read(3)
mov ebx, 0 ;stdin (0)
mov ecx, esi ;Guardamos la string en esi
mov edx, 1 ;nnumero de bytes a leer
int 80h ;llamada al kernel de linux
popfd ;re-establecemos flags
popad ;re-establecemos registros
ret ;retorno para llamar al procedimiento
mov edx,length2 ;longitud del mensaje
mov ecx,esi ;mensaje a escribir
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;llamada a sistema numero 4 (sys_write)
int 80h ;linux esta aqui!
mov eax,1 ;llamada a sistema numero 1 (sys_exit)
int 80h ;llamada al kernel, linux acabará con la ejecución del proceso
section .data
msg db 'Hola mundo!',10 ;la primera cadena
mensaje2 db 'a',10
len equ $ - msg ;longitud de nuestra cadena
length2 equ $ - mensaje2
Saludos
Citar
popfd ;re-establecemos flags
popad ;re-establecemos registros
ret ;retorno para llamar al procedimiento
no tengo experiencia en asm en linux, pero ¿ese ret? ¿donde va a parar?
otra cosa, en este codigo y en el otro veo que haces mucho pop ¿por alguna razon en concreto?
Cita de: ctlon en 3 Julio 2010, 17:41 PM
Citar
popfd ;re-establecemos flags
popad ;re-establecemos registros
ret ;retorno para llamar al procedimiento
no tengo experiencia en asm en linux, pero ¿ese ret? ¿donde va a parar?
otra cosa, en este codigo y en el otro veo que haces mucho pop ¿por alguna razon en concreto?
Para sacar los argumentos de la pila, el primero es el argc y los otros son respectivamente arg[0] (filename) arg[1](argumento)
Y los voy depositando en ebx, asi de la pila los 3 primeros valores son esos, por tanto el tercer valor de la pila y por tanto el ultimo en estar en EBX es el argumento para trabajar el programa de maner dinamica.
Saludos
Tenes que pasar una direccion de memoria en ecx, ahora estas poniendo el VALOR que haya en esi. ¿Cual es ese valor? Igual depuralo con el gdb asi ves donde esta el problema exactamente ...