domingo, 30 de diciembre de 2012

Hello World en ASM

A continuación se muestra el conocido programa "Hello World" en Lenguaje Ensamblador, para compilar se usa NASM para Linux. El programa despliega en la consola de linux el mensaje "Hello World".

_____________________________________________________________________


; Author          : Christian Verastegui 
; Description   : A simple "Hello World" program in assembly for Linux, 
;                        using NASM.
; Build using these commands in console:
;       nasm -f elf -g -F stabs helloworld.asm
;       ld -o helloworld helloworld.o

section .data           ;Section with initiliazed data

HelloW:  db "Hello World", 10
LenHello equ $-HelloW

section .bss            ;Section with unitiliazed data
-----------------------------------------------------------------------------------------------------------------
section .text           ;Section containing code

global _start

_start:
    NOP                             ;No OPeration
    MOV EAX,4                ;Specify sys_write call
    MOV EBX,1                ;Specify File Descriptor 1: Stdout
    MOV ECX,HelloW      ;Put string address into ECX
    MOV EDX,LenHello    ;Put string length into EDX
    INT 80h                         ;Make the Kernel Call

    MOV EAX,1           ;Code for Exit Syscall
    MOV EBX,0           ;Return a code of zero
    INT 80h                   ;Make kernel call



La sección .data contiene información inicializada, es decir, declarar información que necesitaremos el resto del programa, esto podría ser como un #DEFINE en lenguaje C. En este programa almacenamos la cadena de carácteres y la identificamos como HelloW, el término "db" indica define byte y quiere decir que cada caracter será de un byte de tamaño, al final de la cadena está el número 10 que indica un salto de línea, esto podría traducirse en C como "\n". También usamos el comando EQU, que sirve para igualar, en esta instrucción indicamos que LenHello será del mismo largo que la cadena HelloW.

La sección .bss almacena información que no ha sido inicializada, aquí podríamos guardar Buffers, o memorias donde escribiremos. En este programa no se usa porque solamente desplegamos un mensaje.

En la sección .text es donde escribiremos nuestro código, empezamos con una etiqueta llamada global _start, esto es para decirle al compilador que nuestro MAIN se encuentra ahí, la declaramos global para que el compilador la pueda llamar.
Una vez posicionados en la etiqueta _start podemos ver la instrucción NOP, este comando no realiza alguna operación, solo es util cuando usamos breakpoints al inicio del programa.
La instrucción INT 80h quiere decir que realiza un INTerrupción en el programa para llamar a la memoria 80h, en esta dirección le damos al kernel el control, el kernel realiza una operación según lo que vea en los registros EAX, EBX, ECX y EDX.

Las llamadas a Kernel es un tema amplio, pero se puede consultar en el siguiente link:

http://asm.sourceforge.net/syscall.html

Todo esta información la obtuve del libro "Assembly Language. Step by Step Programming with Linux" escrito por Jeff Duntemann, 3era Edición.

Hasta la próxima!

No hay comentarios:

Publicar un comentario