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.