Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Nachrichten - DaeFennek

Seiten: [1]
1
Lowlevel-Coding / Re: .data Section Problem
« am: 01. June 2014, 19:54 »
Hi,

vielen Dank für deine schnelle Antwort. Ich habe das Problem gefunden.

Meine Kernel ist ca. 5,68 KB groß und die Message liegt relativ am Ende des Kernels. Da ich allerdings im Stage 1 Bootloader nur die ersten 10 Sektoren (512 Byte * 10 / 1024) auslese wurde die Message nicht mit in den Speicher geschrieben ( 5,68 KB > 512 Byte * 10 / 1024). Ich habe das Auslesen jetzt auf 20 Sektoren erweitert und nun funktioniert alles.
2
Lowlevel-Coding / .data Section Problem
« 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)
  }
}
Seiten: [1]

Einloggen