Ваш код должен выглядеть примерно так.
org 0x7c00
xor ax, ax
mov ds, ax
jmp Begin
print:
mov ah, 0x0e ; BIOS TTY function
.L0:
lodsb
or al, al
jnz .J0
ret
.J0:
int 0x10
jmp .L0
Prompt:
db 'Hello World', 0
Begin:
mov si, Prompt
call print
.spin:
hlt
jmp .spin
times 510 - $+$$ db 0
dw 0xAA55
Поскольку вы не перепрыгиваете через текст подсказки, это то, что компьютер считает необходимым выполнять сразу после BIOS, так как контроль передаетсязагрузочный сектор.
00 48 dec ax
01 656C gs insb
03 6C insb
04 6F outsw
05 20576F and [bx+0x6f],dl
08 726C jc 0x76
0A 6490 fs nop
Кроме этого, единственное изменение, которое я сделал, - это инициализация AH в цикле, в противном случае, каждый раз, когда вы вызываете функцию, вам придется повторять установку AH.
У меня есть несколько версий загрузчика, и в каждой из них я уделил особое внимание оптимизации, особенно в том, что касается пространства, поскольку в одном секторе может поместиться только столько.
Тамможет быть несколько вариантов этого, но важно, чтобы поток управления шел по предсказуемому пути.