Hola amigos, estoy metiendome en esto del ensamblador, he creado mi primer programa, con nasm:
section .text
global _start ;must be declared for linker (ld)
_start: ;tell linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Hello, world!',0xa ;our dear string
len equ $ - msg ;length of our dear string
Al compilar hago:
debci@debci-laptop:~$ nasm -f elf test.asm
debci@debci-laptop:~$ ld test.o -o test
debci@debci-laptop:~$ gcc test.o -o test
test.o: In function `_start':
test.asm:(.text+0x0): multiple definition of `_start'
/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
/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld devolvió el estado de salida 1
debci@debci-laptop:~$ ./test
bash: ./test: No existe el fichero ó directorio
debci@debci-laptop:~$ gcc test.o -o test
test.o: In function `_start':
test.asm:(.text+0x0): multiple definition of `_start'
/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
/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld devolvió el estado de salida 1
debci@debci-laptop:~$
Y no crea el ejecutable :s
Alguien sabe que me esta pasando?
Saludos
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
Cita de: 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
A okey., gracias!
Saludos
De nadas ::)
Cita de: Eternal Idol en 8 Noviembre 2009, 15:20 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
Cita de: Eternal Idol en 3 Noviembre 2009, 20:47 PMA 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.