Problema al escribir archivo con sys_call numero 8

Iniciado por Debci, 3 Julio 2010, 17:28 PM

0 Miembros y 1 Visitante están viendo este tema.

Debci

Bueno, por fin cuando ya estoy metido de lleno en el mundo de programación con asm, se me presentan los tipicos problemas de logica por falta de conocimiento, que me pasaron cuando estuve en Basi, en Java y en C++.

Bueno el codigo que me deducido es el siguiente:
Código (asm) [Seleccionar]
section .data
hello     db 'Hello, world!',10 ; Our dear string
helloLen  equ $ - hello ; Length of our dear string
        dataSecond    db   'Datos escritos correctamente',10
           dataLen    equ   $ - dataSecond
        file         db    '/root/archivo.txt',10

section .text
    global _start

_start:
pop ebx
        pop ebx
        pop ebx  ;arg[3] o el directorio del archivo a escribir en ebx
       
mov eax,8 ; Syscall a creat
mov ecx,00644Q ; Permisos de lectura en Octal (rw_rw_rw_)
int 0x80 ; Llamada al kernel de Linux
; Ahora tenemos el file descriptor o handler del archivo selecionado en ebx

test eax,eax ; Igualamos si el file descriptor es correcto
js skipWrite
call fileWrite    ; Primer procedimiento de escritura
call fileWSegundo       ; Segundo procedimiento de escritura


skipWrite:
mov ebx,eax ; Guardamos el error en ebx
mov eax,1 ; Syscall 1 - Finalizar ejecucion
int 0x80 ; llamamos al kernel

; proc fileWrite - write a string to a file
fileWrite:
mov ebx,eax ; sys_creat devuelve un handler de archivos en eax, lo ponemos en ebx
mov eax,4 ; sys_write
; ebx is already set up
mov ecx,hello ; La cadena de texto en ecx, como tercer argumento de la función
mov edx,helloLen ; la length de nuestra cadena definida como constante con equ
int 0x80

       
       



fileWSegundo:
        mov ebx,eax ; sys_creat devuelve un handler de archivos en eax, lo ponemos en ebx
mov eax,4 ; sys_write
mov     ecx,dataSecond
        mov     edx,dataLen
        int     0x80

        mov eax,6 ; sys_close
int 0x80
ret ; No se para que sirve pero lo he visto en mas programas :S

; endp fileWrite



La cosa es que no me escribe dicho archivo, he querido crear dos procedimientos para escribir por separado, por mero aprendizaje, el ver que puedo separar la runtime en varios procedimientos, no mas que eso.

Alguien me podria orientar? Y explicarme que hace el ret :P

Eternal Idol

Te recomiendo conseguir algun libro o varios tutoriales en su defecto (no es lo mismo claro), ret:

http://pdos.csail.mit.edu/6.828/2005/readings/i386/RET.htm
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Debci

He leido sobre calls jumps y procedimientos, y en teoria no hay nada mal en lo que he codeado :S


Solo he visto que no haga un Jmp o JE a un proc donde haya ret pues dice que se acabará el programa :S

Saludos

Eternal Idol

¿Ya viste para que sirve ret? En la funcion fileWrite falta ... depuralo.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Debci

Muy cierto ;) Ves un pequeño error ;)
Gracias por aguantar a este pesado, siempre eternal idol, user ejemplar ;)

Saludos