MMM por donde empiezo? [Pregunta del millón]

Iniciado por Debci, 7 Marzo 2010, 19:31 PM

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

Debci

Haber antes de nada aclarar que de ASM se lo que he podido aprender debuggeando apps:
Que EIP apunta a la siguiente direciond e memoria que va ejecutar el procesador
Algunos registros...
que con ADD añadimos datos a un regsitro y se suman....

Y que no dispongo d emedios para comprar ningun libro
Algun PDF, paper, o guia, aunque sea un hi world bien explicado

Me conformo con poder hacer algo por mi cuenta.

Saludos

08l00D

Deberias aclarar primero en que sistema operativo pensas usar ASM y en que procesador, se que puede sonar sin importancia saber en cual que sistema operativo pero la verdad es que para el ensamblador no hay ningun estandar y los ensambladores implementan el lenguaje como mas les plazca... y por eso saber en que sistema para recomendarte un libro es de gran ayuda, por que si usas "algun unix" lo mas recomendable seria que usaras el ensamblador GAS... y si vas a usarlo te puedo recomendar varios buenos libros y material...
Tambien hay libros orientados para windows...
Igualmente todo el ensamblador(segun las instruc.. del procesador) es el mismo cuando sepas ensamblador en cualquier OS y cualquier ensamblador no te va a costar mucho trabajo "mudarte a otro"..
Pone tu sistema operativo... y empeza por lo menos leyendo las chinchetas del subforo que puso Eternal Idol.

Debci

Cita de: 08l00D en  7 Marzo 2010, 19:53 PM
Deberias aclarar primero en que sistema operativo pensas usar ASM y en que procesador, se que puede sonar sin importancia saber en cual que sistema operativo pero la verdad es que para el ensamblador no hay ningun estandar y los ensambladores implementan el lenguaje como mas les plazca... y por eso saber en que sistema para recomendarte un libro es de gran ayuda, por que si usas "algun unix" lo mas recomendable seria que usaras el ensamblador GAS... y si vas a usarlo te puedo recomendar varios buenos libros y material...
Tambien hay libros orientados para windows...
Igualmente todo el ensamblador(segun las instruc.. del procesador) es el mismo cuando sepas ensamblador en cualquier OS y cualquier ensamblador no te va a costar mucho trabajo "mudarte a otro"..
Pone tu sistema operativo... y empeza por lo menos leyendo las chinchetas del subforo que puso Eternal Idol.
Es tipo UNix, Intel
He leido pero hay muchas cosas que aun se escapan a mi comprensión
por ejemplo:
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


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

Luego no entiendo tampoco que significa db, he presupuetso que msg es el identificador de la cadena:
Código (asm) [Seleccionar]
msg db 'Hello, world!',0xa
y el 0xa tampoco lo entiendo.
Basicamente no entiendo nada ;D

Saludos

08l00D

#3
Cita de: ..::| D3Bć1 |::. en  7 Marzo 2010, 20:14 PM
Es tipo UNix, Intel
Bien, entonces te puedo recomendar varios libros y links interesantes que a mi me ayudaron.

El codigo ese si queres te lo explico, pero creo que mas haya de eso seria mas recomendable que leas algun libro(si ya se re pesado pero es lo mas recomendable)

Ese codigo que pusiste es para Linux, y utiliza las llamadas a sistemas que brinda dicho sistema operativo (equivaldrian a las API de Windows).

El codigo lo que hace es mostrar un mensaje en pantalla, mediante la llamada a sistema: sys_write. Los sistemas Unix brindan una interrupcion por software, que no es mas que una rutina, que seria la "0x80" que es la que maneja las llamadas al sistema por asi decirlo. Cuando se salta a la interrupcion "0x80" (A traves de la instruccion "int 0x80"") quiere decir, BASICAMENTE, que queres usar un servicio que brinda el sistema operativo.. Cual de todos? el que especificas en el registro "eax" antes de saltar a la interrupcion... ok y como le paso los parametros a dicho servicio del sistema... facil con los demas registros... (ebx, ecx, edx)
Bueno la explicacion es re cutre pero es lo que se me ocurrio en el momento.
Paso a explicarte el codigo.

mov edx,len -> tercer parametro  a sys_write la longitud de la cadena que queres escribir


mov ecx,msg -> segundo parametro a sys_write y es la direccion de la cadena que queres escribir


mov ebx,1 -> primer parametro para sys_write y es a a que descriptor de fichero vas a escribir en este caso seria a STDOUT osea la salida estandar que seria la pantalla...


mov eax,4 -> en eax va la llamada a sistema que queres realizar a cada sys_call se le asigna un numero a sys_write se le asigna el numero 4


int 0x80 -> aca se invoca a la rutina de manejo de llamadas al sistema... con los parametros asignados arriba


DB significa Define byte, en este caso su uso es similar a declarar un arreglo de caracteres (o cadena para algunos) en C.
El caracter 0xa es el caracter ASCII de salto de linea en decimal es el numero 10 ... LF es lo mismo que el caracter '\n' en C.

Espero hayas comprendido por lo menos un poco mas de como va el codigo ese...
El libro que yo te recomiendo es... "Professional Assembly" ... pero no te dejes llevar por el titulo no es para expertos ni nada de eso .. lo que si es que explica muchas cosas, y es bastante interesante si tenes un unix.. ya que aparte te enseña a programar utilizando las herramientas de gnu binutils (gnu as, gprof, ld, etc etc).. aunque no las explica en profundidad te va a servir de mucho... y esta orientado a la plataforma IA-32 incluso incluye un apartado para las extensiones SIMD, SEE, SEE2 de Intel...
Trata de sobre inline assembly con en C y C++, explica como usar la libreria de C en ensamblador y como crear funciones en ensamblador para utilizar en programas en C o C++, tiene un gran capitulo sobre la FPU, en fin es un buen libro.. Eso si usa la sintaxis AT&T, ya que el ensamblador GAS de GNU usa esa sintaxis que es un poco diferente a la sintaxis Intel pero no menos intuitiva como algunos dicen  :rolleyes: ...
Hace unos meses habia empezado a leer otro libro(el cual lo deje al quinto capitulo  :xD) llamado "Assembly Language step by step" que tambien esta orientado a programacion en Linux .. pero utilizando NASM talvez este te resulte mejor por la sintaxis Intel.. digo nose.. por lo que alcane a ver explica con mas detalle los procesadores de Intel, el manejo de memoria y demas cosas que te van a resultar de mucha ayuda si lo desconocias... El resto del libro es mas o menos lo mismo, supongo, que los demas libros dentro de esta area...

Debci

Totalmente.
Ese codigo ya lo entiendo.
Una cosa, si le indico en el primer parametro envezde 1 un 2 le estare indicando otra salida, no?

Saludos


08l00D

#6
Cita de: ..::| D3Bć1 |::. en  7 Marzo 2010, 21:41 PM
Una cosa, si le indico en el primer parametro envezde 1 un 2 le estare indicando otra salida, no?
No y si, en realidad lo que le estas indicando es en que descriptor de fichero escribir si es en la salida estandar (1), en la entrada(0) ... pero si vos creaste un descriptor de fichero ... independiente de los establecidos por el sistema .. como puede ser si abris un archivo con la sys_call open -> sys_open.. le pasas el descriptor del fichero y escribis en el archivo que abriste es muy parecido a los handles en Windows...
En las paginas del man esta todo lo referente a llamadas al sistema...