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:// 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"
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:ld -T linker.ld -o lala.bin prog.o
qemu -kernel lala.bin