2
« am: 01. June 2014, 15:19 »
Hi,
ich habe ein Problem in meinem Stage 2 Bootloader. Nachdem ich in den Protected Mode springe gebe ich eine kurze Message auf der Console aus, lösche die Console und spring in meine C main Methode.
Das funktioniert soweit auch ganz gut. Wenn ich allerdings die Message in der .data Section definiere, bekomme ich keine Consolenausgabe, die Console wird allerdings gelöscht und ich springe auch erfolgreich in die main Methode.
Zum testen habe ich mal die main Methode aus dem Linker genommen, die Message aber trotzdem in die .data Section gelegt. Hierbei erfolgt die Ausgabe der Message.
Meine Frage: Warum funktioniert die Ausgabe der in der .data Section definiert Message nur, wenn ich die C main Methode nicht mit linke?
Message wird nicht ausgegeben:
section .text
[BITS 32]
[extern main] ; c main
ProtectedMode:
.main:
mov ax, 0x10
mov ds, ax
mov ss, ax
mov es, ax
xor eax, eax
mov fs, ax
mov gs, ax
mov esp, 0x200000 ; set stack below 2 MB limit
call clrscr_32
mov esi, runningProtectedMode
call PutStr_32 ;<-- Ausgabe der Message funktioniert nicht
; call c main
call main
jmp $
PutStr_32:
mov edi, [PutStr_Ptr]
.nextchar:
lodsb
test al, al
jz .end
stosw
jmp .nextchar
.end:
mov [PutStr_Ptr], edi
ret
clrscr_32:
mov edi, 0xb8000
mov [PutStr_Ptr], edi
mov ecx, 40 * 25
mov eax, 0x07200720 ; two times: 0x07 => white text & black background 0x20 => Space
rep stosd
ret
section .data
PutStr_Ptr dd 0xb8000
runningProtectedMode db "Running in 32 Bit ..", 0 ; <-- Message
Message wird ausgegeben:
section .text
[BITS 32]
ProtectedMode:
.main:
mov ax, 0x10
mov ds, ax
mov ss, ax
mov es, ax
xor eax, eax
mov fs, ax
mov gs, ax
mov esp, 0x200000 ; set stack below 2 MB limit
call clrscr_32
mov esi, runningProtectedMode
call PutStr_32 ;<-- Ausgabe der Message funktioniert nicht
; don't call c main
;call main
jmp $
PutStr_32:
mov edi, [PutStr_Ptr]
.nextchar:
lodsb
test al, al
jz .end
stosw
jmp .nextchar
.end:
mov [PutStr_Ptr], edi
ret
clrscr_32:
mov edi, 0xb8000
mov [PutStr_Ptr], edi
mov ecx, 40 * 25
mov eax, 0x07200720 ; two times: 0x07 => white text & black background 0x20 => Space
rep stosd
ret
section .data
PutStr_Ptr dd 0xb8000
runningProtectedMode db "Running in 32 Bit ..", 0 ; <-- Message
Linker:
OUTPUT_FORMAT("binary")
ENTRY(RealMode)
entryPoint = 0x00008000;
SECTIONS
{
.text entryPoint : {
*(.text)
}
.rodata : {
*(.rodata)
}
.data : {
*(.data)
}
.bss : {
*(.bss)
}
}