Problema de novato

Iniciado por Debci, 8 Noviembre 2009, 14:00 PM

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

Debci

Hola amigos, estoy metiendome en esto del ensamblador, he creado mi primer programa, con nasm:

Código (asm) [Seleccionar]
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:

Código (bash) [Seleccionar]

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

Eternal Idol

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
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


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

Eternal Idol

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

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

Eternal Idol

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.
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