Hallo,
ich versuche mich seit kurzem in der Assembler-Programmierung. Die einfache Testausgabe im Real-Mode ist mir bereits gelungen. Ich denke auch, dass ich das Prinzip mittlerweile so einigermaßen verstanden habe. Nur leider habe ich mit dem Protected-Mode so meine Probleme. Folgender Code scheint im Prinzip zu funktionieren , also es gibt kein Tripple-Fault
, nur leider klappt die Textausgabe nicht. Nach "mov edi, 0xB8000" scheint 0x88000 in edi zu stehen, dort scheinen dann auch die Zeichen zu landen (wenn ich den Debugger richtig bedient habe
). Was habe ich falsch gemacht?
Vielen Dank für eure Hilfe.
[BITS 16]
; Segmente setzen
mov ax, 0x7C0
mov ds, ax
mov ss, ax
mov sp, 0xFFFF
; In Code-Segment springen
jmp 0x07C0:realModeEntry
nullDescriptor:
dd 0x0
dd 0x0
codeSegmentDescriptor:
dw 0xFFFF
dw 0x0
db 0x0
db 0x9A
db 0xCF
db 0x0
dataSegmentDescriptor:
dw 0xFFFF
dw 0x0
db 0x0
db 0x92
db 0xCF
db 0x0
gdt:
.limit dw 0
.base dd 0
message db 'Hello World!', 0
realModeEntry:
cli ; Interrupts deaktivieren
mov [gdt.base], DWORD nullDescriptor + 0x7C00
mov [gdt.limit], WORD gdt - nullDescriptor - 1
lgdt [gdt]
mov eax, cr0
or eax, 1
mov cr0, eax
jmp 0x8:protectedModeEntry + 0x7C00
protectedModeEntry:
mov eax, 0x10
mov ds, eax
mov es, eax
mov ss, eax
mov eax, 0
mov fs, eax
mov gs, eax
mov esp, 0xFFFF
mov ah, '#'
mov al, 0x0F
mov edi, 0xB8000
stosw
mov esi, DWORD message + 0x7C00
printMessage:
mov edi, 0xB8000
.loop:
lodsb
test al, al
jz .done
stosb
mov al, 0x0F
stosb
jmp .loop
.done:
jmp $
TIMES 510-($-$$) db 0
dw 0xAA55