9
« am: 05. August 2004, 16:18 »
Hi !
Ich hab jetzt versucht dem Problem auf die Spur kommen ...
Ich hab den Protected Mode Code von obigen Link genommen, ich glaube der ist einfacher zu debuggen (nach Roshl Methode), da nur eine Datei. Also der folgende Code ist ein Bootloader in dem bereits in den PM geschaltet wird :
[BITS 16] ; We need 16-bit intructions for Real mode
[ORG 0x7C00] ; The BIOS loads the boot sector into memory location 0x7C00
cli ; Disable interrupts, we want to be alone
mov si, msg
call putstr ; Meldung ausgeben
xor ax, ax
mov si, msg
call putstr ; Meldung ausgeben
mov ds, ax ; Set DS-register to 0 - used by lgdt
mov si, msg
call putstr ; Meldung ausgeben
lgdt [gdt_desc] ; Load the GDT descriptor
mov si, msg
call putstr ; Meldung ausgeben
mov eax, cr0 ; Copy the contents of CR0 into EAX
mov si, msg
call putstr ; Meldung ausgeben
or eax, 1 ; Set bit 0
mov si, msg
call putstr ; Meldung ausgeben
mov cr0, eax ; Copy the contents of EAX into CR0
mov si, msg
call putstr ; Meldung ausgeben
jmp 08h:clear_pipe ; Jump to code segment, offset clear_pipe
msg db "TEST",13,10,0
msg2 db "TEST2",13,10,0
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
[BITS 32] ; We now need 32-bit instructions
clear_pipe:
mov ax, 10h ; Save data segment identifyer
mov si, msg2
call putstr ; Meldung ausgeben
mov ds, ax ; Move a valid data segment into the data segment register
mov si, msg2
call putstr ; Meldung ausgeben
mov ss, ax ; Move a valid data segment into the stack segment register
mov si, msg2
call putstr ; Meldung ausgeben
mov esp, 090000h ; Move the stack pointer to 090000h
mov si, msg2
call putstr ; Meldung ausgeben
mov byte [ds:0B8000h], 'P' ; Move the ASCII-code of 'P' into first video memory
mov si, msg2
call putstr ; Meldung ausgeben
mov byte [ds:0B8001h], 1Bh ; Assign a color code
mov si, msg2
call putstr ; Meldung ausgeben
hang:
jmp hang ; Loop, self-jump
gdt: ; Address for the GDT
gdt_null: ; Null Segment
dd 0
dd 0
gdt_code: ; Code segment, read/execute, nonconforming
dw 0FFFFh
dw 0
db 0
db 10011010b
db 11001111b
db 0
gdt_data: ; Data segment, read/write, expand down
dw 0FFFFh
dw 0
db 0
db 10010010b
db 11001111b
db 0
gdt_end: ; Used to calculate the size of the GDT
gdt_desc: ; The GDT descriptor
dw gdt_end - gdt - 1 ; Limit (size)
dd gdt ; Address of the GDT
times 510-($-$$) db 0 ; Fill up the file with zeros
dw 0AA55h ; Boot sector identifyer
Wie man sieht, lasse ich nach fast jedem Befehl eine Message ausgeben.
Wenn ich den Code von ner Diskette boote, bekomme ich 2 Meldungen ausgegeben. Nachdem das DS auf 0 gesetzt wird passiert nix mehr. Findet er nun
den String nicht mehr oder hängt er sich hier auf ?