Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: Debci en 8 Noviembre 2009, 14:00 pm



Título: Problema de novato
Publicado por: Debci en 8 Noviembre 2009, 14:00 pm
Hola amigos, estoy metiendome en esto del ensamblador, he creado mi primer programa, con nasm:

Código
  1. section .text
  2.    global _start ;must be declared for linker (ld)
  3.  
  4. _start: ;tell linker entry point
  5.  
  6. mov edx,len ;message length
  7. mov ecx,msg ;message to write
  8. mov ebx,1 ;file descriptor (stdout)
  9. mov eax,4 ;system call number (sys_write)
  10. int 0x80 ;call kernel
  11.  
  12. mov eax,1 ;system call number (sys_exit)
  13. int 0x80 ;call kernel
  14.  
  15. section .data
  16.  
  17. msg db 'Hello, world!',0xa ;our dear string
  18. len equ $ - msg ;length of our dear string

Al compilar hago:

Código
  1. debci@debci-laptop:~$ nasm -f elf test.asm
  2. debci@debci-laptop:~$ ld test.o -o test
  3. debci@debci-laptop:~$ gcc test.o -o test
  4. test.o: In function `_start':
  5. test.asm:(.text+0x0): multiple definition of `_start'
  6. /usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crt1.o:/build/buildd/glibc-2.9/csu/../sysdeps/i386/elf/start.S:65: first defined here
  7. /usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crt1.o: In function `_start':
  8. (.text+0x18): undefined reference to `main'
  9. collect2: ld devolvió el estado de salida 1
  10. debci@debci-laptop:~$ ./test
  11. bash: ./test: No existe el fichero ó directorio
  12. debci@debci-laptop:~$ gcc test.o -o test
  13. test.o: In function `_start':
  14. test.asm:(.text+0x0): multiple definition of `_start'
  15. /usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crt1.o:/build/buildd/glibc-2.9/csu/../sysdeps/i386/elf/start.S:65: first defined here
  16. /usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crt1.o: In function `_start':
  17. (.text+0x18): undefined reference to `main'
  18. collect2: ld devolvió el estado de salida 1
  19. debci@debci-laptop:~$
  20.  

Y no crea el ejecutable :s

Alguien sabe que me esta pasando?

Saludos


Título: Re: Problema de novato
Publicado por: Eternal Idol en 8 Noviembre 2009, 14:30 pm
Despues de ensamblar y enlazar ya podes ejecutar tu programa (no hace falta involucrar al compilador gcc):

nasm -f elf test.asm
ld test.o -o test
./test


Título: Re: Problema de novato
Publicado por: Debci en 8 Noviembre 2009, 15:12 pm

Despues de ensamblar y enlazar ya podes ejecutar tu programa (no hace falta involucrar al compilador gcc):

nasm -f elf test.asm
ld test.o -o test
./test
A okey., gracias!

Saludos


Título: Re: Problema de novato
Publicado por: Eternal Idol en 8 Noviembre 2009, 15:20 pm
De nadas  ::)


Título: Re: Problema de novato
Publicado por: Debci en 8 Noviembre 2009, 21:35 pm
De nadas  ::)
Siento alargar el post inutilmente, pero me podrias explicar un poco por encima ese codigo, mira he hecho Java y C++ a un nivel bastante alto, pero no comprendo nada, de nada.
Palabras extraña que solo ahcen que reniegue de mi coherencia en la programacion :s

Saludos


Título: Re: Problema de novato
Publicado por: Eternal Idol en 8 Noviembre 2009, 23:32 pm
A grosso modo en Linux se pone en eax el numero del servicio y los siguientes parametros van en ebx, ecx, edx, esi, edi y ebp.

En /usr/include/asm/ unistd.h/unistd_32.h/unistd_64.h encontraras los numeros de los servicios.

1 es __NR_exit y el 0 que se le pasa como parametro en ebx es el valor de retorno del programa (http://linux.die.net/man/2/exit).

4 es __NR_write y el 1 que le pasas como primer parametro en ebx es STDOUT (salida por consola), el segundo parametro (ecx) deberia ser el puntero a la cadena y el tercer parametro (edx) el tamaño de la cadena.

http://linux.die.net/man/2/write

Igual si lees los comentarios del codigo ahi te indica todo.