Вы не call printMsg
, поэтому RET
на return:
некуда деваться. Кроме того, ваш jmp 0x7c00
находится не в том месте, он недоступен.
Более того, как сказал Питер , вы не гарантированно получите CS:IP = 0000:7C00
, это может быть 07C0:0000
в зависимости от реализации BIOS,Тем не менее, с этой директивой ORG 0x7C00
NASM соберет jmp 0x7c00
в относительный переход, как если бы вы поместили метку вверху вашего файла. Но на самом деле вы должны просто сделать это в первую очередь.
Исправленная версия может выглядеть следующим образом:
BITS 16
ORG 0x7C00
start:
XOR AX, AX
MOV DS, AX
; you could also put the start label here
; no need to reload DS
LEA BX, [msg]
CALL printMsg
JMP start
printMsg:
MOV AL, [BX]
INC BX
TEST AL, AL
JZ return
CALL printc
JMP printMsg
return:
RET
printc:
MOV AH, 0Eh
int 10h
RET
msg: db "Hello",0
times 510-($-$$) db 0x90
dw 0xAA55