Creative Commons License krshock: insanidad garantizada por krshock está licenciado según la Creative Commons Atribución-No Comercial-Sin Derivadas 2.0 Chile License. excepto en los casos que se declare explícitamente otra licencia o autor.





Chileno, Talquino, Santiaguino y Talquino.

martes, enero 04, 2011

Hola mundo en assembler (sin sistema operativo)

Siempre he creído que para iniciarse en algo nuevo hay que (como dirían por mis tierras) "tirar toda la carne a la parrilla". Y como el kernel de linux tiene una estructura ridículamente complicada he decidido aprender ciertas cosas por mi cuenta.
Esta vez nada de fanboyismos ni esas cosas de mal gusto que proliferan por la interné, todo el código es liberado bajo licencia pública por aburrimiento y decisión propia.
// prog.S
// Prototipo programa Assembler
// Hola Mundo Sin sistema operativo para IA32, i386 o x86

// by krshock! krshock@gmail.com
// Código licenciado como material de Dominio Público

.globl kloader

// Lea la especificación multiboot para entender las siguientes cuatro lineas:

.align 4; // Encabezado multiboot
.long 0x1BADB002; // Multiboot magic number
.long 0x00000003; // Multiboot flags
.long 0-(0x1BADB002 + 0x00000003); // Multiboot Flags Checksum

// Espacio reservado para nuestro stack
.comm __stack, 0x4000


// Primera función ejecutada
kloader:

// Define un espacio en memoria seguro para utilizar como stack
mov __stack+0x4000, %ebp

// Llama a la función 'main'
call main

// Desactiva las interrupciones
cli

// Fin del programa en un loop infinito para hacer un HALT a la cpu.
loop:
hlt
jmp loop; // esto es para 'solo para asegurarse'


// Funcion principal (llamada desde kloader)
main:

// Borrar pantalla para eliminar cualquier mensaje de la BIOS.
call clscr

// Mover a EAX el 'puntero' al mensaje "hola mundo" (definido al final)
// (Nótese el paso de parametros al procedimiento asprint sin empujarlo al
// stack como ocurre en C)
mov $.msg,%eax
call asprint
ret


// Imprime un mensaje desde un puntero en EAX en el extremo superior de la
// pantalla. La dirección de memoria 0xb8000 corresponde exactamente al primer
// carácter de la pantalla de texto.
asprint:
push %ebp
mov %esp, %ebp

mov $0xb8000,%ebx
.prloop:
mov (%eax),%cl
mov %cl,(%ebx)
inc %eax
add $2,%ebx
cmp $0,(%eax)
jne .prloop
pop %ebp
ret

// Clear Screen (borrar pantalla)
// Elimina cualquier texto de la pantalla. No reiniciará los colores, solo
// los caracteres.
clscr:
push %ebp
mov %esp, %ebp
mov $0xb8000,%ebx; // Puntero al primer caracter en pantalla en EBX
mov $0xb8000,%ecx
add $160*25-2,%ecx; // Puntero al último caracter de la pantalla en ECX
mov $' ',%al;
.clsloop:
mov %al,(%ebx)
add $2,%ebx
cmp %ecx, %ebx
jna .clsloop
pop %ebp
ret

.msg:
.ascii "ensamblador: Hola mundo!\0"
dicen las malas lenguas que esto compila en linux con el comando:
as prog.S -o prog.o -g
ld -T linker.ld -o lala.bin prog.o
además chico pérez me dice por interno que esto se puede probar con el emulador qemu:
qemu -kernel lala.bin

No hay comentarios.: