EXPERIMENTO 003 · x86-os-experiment
setor de boot
o assembly por trás de um hello world da BIOS
Pergunta
Como este setor de boot coloca uma mensagem na tela usando serviços da BIOS? O assembly real de um experimento para aprender x86, junto com o comportamento registrado em suas anotações de aprendizado. O Lab apresenta o código-fonte; ele não faz o boot desse código nem o emula.
Bancada
src/main.asm · e9668891 / 5 · entrada
org 0x7C00bits 16%define ENDL 0x0D, 0x0Astart: jmp mainNota
O NASM é instruído a montar código de 16 bits com origem em 0x7C00. A entrada salta para main; org descreve o endereço esperado, em vez de carregar o código.
main: mov ax, 0 mov ds, ax mov es, ax mov ss, ax mov sp, 0x7C00 mov si, msg_hello call puts hlt.halt: jmp .haltNota
O código inicializa DS, ES e SS com zero, define SP como 0x7C00, aponta SI para a mensagem e chama puts. Depois de imprimir, chega a hlt e a um laço antes dos dados.
puts: push si push ax.loop: lodsb or al, al jz .done mov ah, 0x0E mov bh, 0x00 int 0x10 jmp .loop.done: pop ax pop si retNota
A rotina salva SI e AX, lê os caracteres com lodsb e para no terminador zero. A interrupção 0x10 da BIOS, com AH = 0x0E, imprime cada caractere. Os registradores salvos são restaurados antes do retorno.
msg_hello: db 'Hello, World!', ENDL, 0Nota
A mensagem em si é seguida por ENDL (retorno de carro e avanço de linha, definido em entrada/) e por um byte zero que termina a string.
times 510 - ($ - $$) db 0dw 0xAA55Nota
O NASM preenche o setor com bytes zero até o offset 510 e então escreve a palavra 0xAA55. Em little-endian, a ordem dos bytes é 55 AA. Isto explica a diretiva do código-fonte; não é um dump de bytes compilados.
Hello, World!Importante
As anotações de aprendizado do projeto registram esta saída no QEMU. Esta página não faz o boot do código-fonte nem reproduz essa verificação.
As seções agrupam o código-fonte por finalidade, não pela ordem do arquivo. Os comentários do código-fonte foram omitidos.
Fidelidade
código-fontereal · revisão e966889 · comentários omitidos
execuçãonenhuma · sem boot e sem emulação
resultadodocumentado nas anotações do projeto
Baseado na revisão e966889 do x86-os-experiment. O resultado Hello, World! está documentado nas anotações do projeto e não foi reproduzido de forma independente aqui.