_____________________________________________________________________
; 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!