Comenzando con GNU Assembler (GAS)


En estas semanas en la UNIversidad estuve viendo lo que es un poco de assembler, pero sucede que cuando se explica se usa herramientas privativas como NASM, por lo cual decidí buscar herramientas libres y encontré que existía GNU Assembler (GAS) dentro del sistema GNU, el cual usa la sintaxis de AT&T, así que decidí aprender el uso de GAS y ahora procederé a explicar un par de ejemplos.

En este articulo explicare sobre imprimir una cadena, macros y algunas otras cositas que encontré por ahí. Tener en claro que esto lo he aprendido de diferentes códigos, ya que encontré poca información en la red, así que si me equivoco en algún concepto por favor díganmelo.

Cada código para poder tenerlo como ejecutable, deberemos de ensamblarlo (volverlo a código objeto “.o”) y luego Vincularlo (volverlo ejecutable). Para esto haremos los siguientes comandos en la consola con cada ejemplo encontrado debajo.

Primero lo ensamblamos:

as –o programa.o programa.s

Segundo lo vinculamos:

ld –o programa programa.o

Al final los ejecutamos:

./programa

Ejemplo1

#Definimos el segmento de datos
.section .data
	mensaje: .ascii "Hola Urpi\n" #Definimos una variable mensaje
	longitud = . - mensaje #Definimos la longitud de mensaje

#Definimos el segmento de texto
.section .text
	.globl _start #Le damos el punto de entrada _start

_start:
	movl $longitud, %edx #Asignamos longitud a edx
	movl $mensaje,%ecx #Asignamos mensaje a edx
	movl $1,%ebx
	movl $4,%eax
	int $0x80 #Similar a la llamada 21 del MS-DOS

	#Terminamos el programa
	movl $0,%ebx
	movl $1,%eax
	int $0x80 #Llamando al kernel

En el ejemplo1 usamos la sección (similar a segmento) “data” para definir variables, dentro de la sección “text” vamos a poner el código en si, cabe notar también que ahora es movl en lugar de mov y que el orden es inverso y ahora se usa “%” antes de llamar a los registros, los comentarios se pueden hacer con “//”, “#” o “/* … */” (sin las comillas), entre algunas otras diferencias.

Ejemplo2

#Creamos un macro para definir la funcion imprimir
.macro imprimir cadena longitud
	movl \longitud,%edx
	movl \cadena,%ecx
	movl $1,%ebx
	movl $4,%eax
	int $0x80
.endm

.macro terminar
	movl $0,%ebx
	movl $1,%eax
	int $0x80 #Llamando al kernel
.endm

#Definimos el segmento de datos
.section .data
	msg_saludo: .ascii "Hola Urpi\n" #Definimos una variable mensaje
	long_saludo = . - msg_saludo #Definimos la longitud de mensaje
	msg_email: .ascii "To correo es : ovegar (at) uni (dot) pe\n"
	long_email = . - msg_email

#Definimos el segmento de texto
.section .text
	.globl _start #Le damos el punto de entrada _start

_start:
	imprimir $msg_saludo $long_saludo #Mandamos msg_saludo y long_saludo al macro imprimir
	imprimir $msg_email $long_email
	terminar #Terminamos el programa, el codigo ahora esta en el macro terminar

En el ejemplo2 ahora necesitamos imprimir dos cadenas y como usaremos código de manera repetitiva código, entonces crearemos macros que vendría a ser similar a funciones.

Se puede encontrar información para poder iniciar en esta web de IBM.

Anuncios

5 pensamientos en “Comenzando con GNU Assembler (GAS)

  1. wena onda compa, esta muy bueno este post, es de gran ayuda para mi que empiezo con assembler y sobre todo con una notacion como la de at&t, pues todo es relativamente nuevo para mi.

    • Hola sipfun, que bueno que te haya ayudado el post, este año en la Universidad me explicaron algo de Assembler con la sintaxis de Intel, pero yo deseando aprender sobre software en GNU me puse a investigar sobre GAS y encontré algunas cosas que no eran muchas, por eso espero escribir dentro de poco otro post con mas funciones de GNU Assembler.

    • Hola esteban, el “\” se usa para reconocer que es una variable que esta dentro de la macro. De esta forma diferenciara a las etiquetas de las variables.

      De la pagina de la IBM citada en el post:
      “A backslash precedes the name of each argument of the macro when the name is actually used inside a macro. If this is not done, the linker would treat the names as labels rather then as arguments and will report an error. “

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s