Quando ligamos o computador há uma checagem e após ela, o computador automaticamente começa a procurar o setor de 512 bytes que estão gravados no primeiro setor do seu HD, em que:

Cabeça e Trilha são 0’s no 1º setor, mais conhecido como LBA que advém do inglês, ao pé da letra Logical Block Adressing

LBA é um esquema de enderaçamento linear onde blocos são localizados por um índice de números inteiros sendo o primeiro bloco LBA 0, o segundo LBA 1 e vice-versa.

Se forem avistados os tais 512 bytes, o processo é iniciado tendo mais uma checagem, que se os dois últimos bytes estão vinculados ao endereço 0xAA55, caso seja algo diferente do esperado não há carregamento.Sendo correspondente a 0xAA55, carrega a memória no endereço físico 0x7c00.

O bootloader é como uma arrancada para que os sistemas operacionais carreguem, e inicializem na memória principal a partir do kernel, normalmente eles são divididos em duas etapas:

Estágios 1 e 2

o primeiro estágio apenas verifica os dois últimos bytes, logo após será carregado neste número mágico: 0x7c00, 0x07c0:0x0000.

o segundo estágio, é o que carrega o kernel na memória principal e a partir disto transfere-o a execução. O estágio dois se encarrrega de várias informações úteis para o kernel e as configurações do dispositivo como: ativar a GATE A20, mudar o modo do processador para protegido pois estamos no modo real( 16 bits).

Este estágio 2 que mencionei acima, geralmente se encontra logo após os 512 bytes do disco(LBA 1, setor 2);Pode ser carregado em qualquer região da memória, desde que esteja livre, isso é no primeiro MiB  da memória física no intervalo 0x600-8FFFF.

Criando um arquivo teste

bits 16 ; diretiva do nasm, modo 16 bits
 org 0x7c00 ; offset
 

jmp short start ; pula para o início do programa

message db "ERROR on boot sector", 0 

dap: 
 db 0x10 ; tamanho da DAP 16 bytes
 db 0 ; reservado 
 dw 16 ; nº do setor a ler
 dw 0x8000 ; offset
 dw 0x0000 ; segmento 
 dd 1 ; setor start
 dd 0 ; setor starting 

dap_end:

start:

cli ; desabilitando interrupções
 xor ax,ax  ; zera ax
 mov ds,ax ; ds igual a 0
 mov es,ax ; es igual a 0
 mov ss,ax ; ss igual a 0
 mov sp,0x200 ; 512 bytes da pilha
 sti ; habilita interrupções
;define o modo de vídeo, modo texto 
mov ax,3
 int 0x10
; empurra na pilha ax,si, ds
push ax
 push si
 push ds

mov si,dap ; entrada dos params do DAP 
 mov dl,0x80 ; seleciona o disco 
 mov ah,0x42 ; função da BIOS para ler o setor 
 int 0x13 ; interrupção do disco 

jc erro ; se CF=1 erro
;desempilha ds,si,ax 
pop ds
 pop si
 pop ax

push dx ;empurra dl na pilha 
 jmp 0x0000:0x8000 ; executa segundo estágio 

erro:
 pop ds
 pop si
 pop ax

mov si,message
 call puts

xor ax,ax
 int 0x16
 int 0x19 ; reboot 
; função para imprimir a mensagem na tela 
puts:
 pusha ; empilha todos os registradores de modo geral 
 .next: 
 cld ; flag de direção 
 lodsb ; a cada loop carrega si p ---> al, renovando si
 cmp al,0 ; compara al com 0
 je .end ; pula para o fim do programa 
 mov ah,0x0e ; função TTY da BIOS 
 int 0x10 ; interrupção da BIOS 
 jmp .next ; próximo caracter a ser  

.end:
 popa
 ret ; retorna 

times 512-2- ($-$$) db 0 ;fará com que se tenha 512 bytes - 2 
 dw 0xaa55 ; assinatura de boot
 


Comando para montar o teste
após isso 
 
-------------------------------------------------------------------------------
Deve aparecer isso na sua tela após o teste