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