I've been trying to compile a simple boot loader using NASM:
Code: Select all
[ORG 7C00h] ; Onde a BIOS nos coloca
; ---------------------------------------------------------
; Programa principal
; ---------------------------------------------------------
inicio:
; Configurar a pilha.
; N?o podemos permitir interrup??es durante a configura??o
cli ; Disabilitar interrup??es
mov ax, 0x9000 ; Por a pilha em 9000:0000
mov ss, ax ; Transferir o endere?o para o registrador
; do segmento da pilha (SS)
mov sp, 0 ; Zerar ponteiro do topo da pilha
sti ; Habilitar interrup??es (SeT Interrupts bit)
mov [bootdrv], dl ; DL indica o drive de boot
call carregar ; Chamar a fun??o que reseta a controladora
; e faz a leitura de setores do disco
jmp far 1000h:0 ; Salta para o buffer com o c?digo
; ---------------------------------------------------------
; Fun??es e vari?veis do nosso bootstrap
; ----------------------------------------------------------
bootdrv db 0 ; A identifica??o do drive de boot
carregar:
push ds ; Preserva o valor do segmento de dados na pilha
.reset:
mov ax, 0 ; Servi?o que reseta o sistema de disco
mov dl, [bootdrv] ; Drive que deve ser resetado
int 13h ; INT 13 faz o reset
jc .reset ; Falhou -> Tentar novamente (jc=jump on carry)
pop ds ; Retoma o valor do segmento de dados da pilha
.leitura:
mov ax,0x1000 ; O buffer deve ficar em 1000:0000
mov es,ax ; Transfere 1000 para ES (Extra Segment)
mov bx, 0 ; e transfere 0 de deslocamento para BX
; O resultado ? ES:BX com 1000:0000
mov ah, 2 ; Servi?o 2 da INT 13 => Ler setores de disco
mov al, 5 ; Ler 5 setores (? mais do que suficiente)
mov cx, 2 ; Cilindro=0, Setor=2
mov dh, 0 ; Cabe?a=0
mov dl, [bootdrv] ; Drive=drive de boot
int 13h ; Leia! ES:BX = dados do disco
jc .leitura ; falhou -> Tente novamente
retn ; Terminada a leitura, retornar
times 512-($-$$)-2 db 0 ; Preenche com 0 at? setor ter 512 bytes
dw 0AA55h ; P?e a assinatura do setor de boot
Code: Select all
E:\MyOS\NumaBoa>nasm loader3.asm -f bin -o loader3.bin
loader3.asm:21: error: mismatch in operand sizes
Code: Select all
mov ax, 1000h ; P?e endere?o em AX
mov ds, ax ; Atualiza o segmento de dados
mov es, ax ; Atualiza o segmento extra
mov si, msg ; Aponta para a string da mensagem
call poeString ; Chama a fun??o para imprimir a mensagem
pendura: ; Apenas pendura
jmp pendura
; Imprime uma string terminada em 0 (SI=ponteiro para a string)
poeString:
lodsb ; Copia o byte em DS:SI para AL e incrementa SI
or al,al ; Verifica se o byte lido ? zero
jz short volta ; Se sim, salta para volta
mov ah,0x0E ; Servi?o 0E da INT 10 da BIOS (Imprimir caracter)
mov bx,0x0007 ; Imprimir branco em fundo preto
int 0x10 ; Imprimir caracter
jmp poeString ; Pegar pr?ximo caracter
volta:
retn ; Terminada a tarefa, voltar ao ponto de chamada
msg db 'Sistema Operacional NumaBoa II',13,10,0
Plz help fixing the loader!