Потому что он начинает выполнять код прямо по инструкции на 7c00
. Это, к сожалению, где у вас есть строка.
Перед этой строкой должна стоять инструкция jmp
, чтобы она перешла на start
.
Обычно это короткий прыжок EB xx
, за которым следует NOP 90
. Некоторые BIOS могут настаивать на том, что он имеет такую форму, даже если это не имеет большого значения для процессора.
Другими словами, вы бы искали что-то вроде:
org 0x7c00
bits 16
realstart:
jmp short start
nop
str:
db "Some say the world will end in fire",10,13
:
db "Robert Frost - Fire and Ice"
db 0
start:
xor ax,ax
:
Просто имейте в виду, что короткий прыжок ограничен тем, какое расстояние он может пройти, примерно +/- 128 байт, поэтому размер вашей строки будет обязательно ограничен этим. Если ваш BIOS не требует формата EB xx 90
, вы можете просто сделать обычный переход.
Другая вещь, которую вы можете попробовать, - переместить всю строку после инструкции hlt
:
org 0x7c00
bits 16
start:
xor ax,ax
:
end:
cli
hlt
str:
db "Some say the world will end in fire",10,13
:
db "Robert Frost - Fire and Ice"
db 0
но, опять же, это зависит от того, что в BIOS не требуется комбо jmp/nop
при запуске.