Lesen aus dem Speicher im 8086-Real-Modus unter Verwendung von 'ORG 0x0000'

Ich habe mit der x86-16-Assembly rumgespielt und sie mit VirtualBox ausgeführt. Wenn ich aus dem Gedächtnis lese und versuche, es als Zeichen auszudrucken, erhalte ich aus irgendeinem Grund ganz andere Ergebnisse als erwartet. Wenn ich das Zeichen jedoch als Teil der Anweisung hartcodiere, funktioniert es einwandfrei. Hier ist der Code:

ORG 0
BITS 16

push word 0xB800        ; Address of text screen video memory in real mode for colored monitors
push cs
pop ds                  ; ds = cs
pop es                  ; es = 0xB800
jmp start

; input = di (position*2), ax (character and attributes)
putchar:
    stosw
    ret

; input = si (NUL-terminated string)
print:
    cli
    cld
    .nextChar:
        lodsb   ; mov al, [ds:si] ; si += 1
        test al, al
        jz .finish
        call putchar
        jmp .nextChar
    .finish:
        sti
        ret

start:
    mov ah, 0x0E
    mov di, 8

    ; should print P
    mov al, byte [msg]
    call putchar

    ; should print A
    mov al, byte [msg + 1]
    call putchar

    ; should print O
    mov al, byte [msg + 2]
    call putchar

    ; should print !
    mov al, byte [msg + 3]
    call putchar

    ; should print X
    mov al, 'X'
    call putchar

    ; should print Y
    mov al, 'Y'
    call putchar

    cli
    hlt

msg: db 'PAO!', 0

; Fill the rest of the bytes upto byte 510 with 0s
times 510 - ($ - $) db 0

; Header
db 0x55
db 0xAA

Das Drucketikett und die darin enthaltenen Anweisungen können ignoriert werden, da ich es noch nicht verwendet habe, da ich versucht habe, ein im Speicher gespeichertes Zeichen zu drucken. Ich habe es mit FASM und NASM zusammengebaut und habe das gleiche Problem, was bedeutet, dass es offensichtlich meine Schuld ist.

It druckt so etwas wie:

Antworten auf die Frage(2)

Ihre Antwort auf die Frage