В этом коде 2 ошибки.
os_main:
hello db "Hi!", 0
mov si, hello
call print
jmp $
Вы поместили строку на метку hello в пути выполнения программы! ЦП выполнит эти 4 байта («H», «i», «!», 0), как если бы они представляли инструкции. Очевидно, нет. Следовательно, вывод gibberi sh.
Это будет работать:
os_main:
mov si, hello
call print
jmp $
hello db "Hi!", 0
Как и в комментарии fuz, код print неверен в том, что он использует регистр неправильного адреса (BX
), соответствующий вашему звонку (SI
).
Лучше использовать следующий код:
; IN (si) OUT ()
print:
pusha
mov bx, 0007h ; BH is DisplayPage, BL is GraphicsColor
start:
mov al, [si] ; <<<<<<<<<
cmp al, 0
je done
mov ah, 0x0E ; BIOS.Teletype
int 0x10
inc si ; <<<<<<<<<
jmp start
done:
popa
ret
; IN () OUT ()
print_nl:
pusha
mov bh, 0 ; BH is DisplayPage (No need for GraphicsColor in BL)
mov ax, 0x0E0D ; BIOS.Teletype CR
int 0x10
mov ax, 0x0E0A ; BIOS.Teletype LF
int 0x10
popa
ret