Du musst ds und es auf Null setzten. Den Stackpointer würde ich auf FFFEh setzten, da der Stack nach niedrigaren Adressen wächst. Also würde der Code so aussehen:
org 0x7C00 ; Startadresse
start:
cli ; Keine Interrupts!
xor ax,ax
mov ds,ax
mov es,ax
mov ax, 0x9000 ; Stackadresse
mov ss, ax ; SS = 9000 (unser Stack)
mov sp, 0xFFFE ; SP = 0000 (der Stackpointer)
sti ; Interrupts zulassen
mov si,msg
call putstr ; Meldung ausgeben
ende: jmp ende
; ----------------------------------------------
; Funktionen und Variablen
; ----------------------------------------------
msg db "Hello World",13,10,0
; Einen String ausgeben:
putstr:
lodsb ; Byte laden
or al,al
jz short putstrd ; 0-Byte? -> Ende!
mov ah,0x0E ; Funktion 0x0E
mov bx,0x0007 ; Attribut-Byte (wird nicht benötigt)
int 0x10 ; schreiben
jmp putstr ; Nächstes Byte
putstrd:
retn
times 512-($-$$)-2 db 0 ; Dateilänge: 512 Bytes
dw 0AA55h