2016-11-02 8 views
3

Ich versuche, den geschützten Modus zu gelangen und danndruckbare Zeichen zu Bildschirm ASM im geschützten Modus

„Hallo“ auszudrucken Aber anstatt es nur druckt „Loading OS“ von meinem BIOS Interrupt-Aufruf (was vorher passierte Eingabe PMode) Und sonst nichts.

Mein Bootloader.asm

%DEFINE KERNEL_LOAD_OFFSET 0x1000 

org 0x7c00 

bits 16 

xor ax, ax 
mov ds, ax 

start: jmp main 

Print: 
.print: 
    lodsb 
    or al, al 
    je .done 

    mov ah, 0x0E 
    int 0x10 

    .repeat: 
    jmp .print 

.done: 
    ret 

ResetFloppy: 
mov ah, 0x0 

int 0x13 
jc ErrorFloppy 
.done: 
    ret 

ReadFloppy: 

mov ah, 0x02 
int 0x13 

jc ErrorFloppy 

.done: 
    ret 

ErrorFloppy: 

mov si, msgErrorFloppy 
call Print 

jmp hang 


main: 
.print: 

    mov si, msg 
    call Print 

.loadFile: 
    mov al, 0xF 
    mov ch, 0x0 
    mov cl, 0x02 
    mov dh, 0x0 
    mov dl, 0x0 
    mov bx, KERNEL_LOAD_OFFSET 

    call ResetFloppy 
    call ReadFloppy 


.loadGDT: 
    lgdt [gdtr] 
.pM_start: 
    cli 
    pusha 

    mov eax, cr0 
    or al, 1 
    mov cr0, eax 

    popa 

    jmp 0x08:ljmp_pM 


bits 32 
ljmp_pM: 
    mov ax, 0x10 
    mov ds, ax 
    mov ss, ax 
    mov fs, ax 
    mov es, ax 
    mov gs, ax 

    jmp KERNEL_LOAD_OFFSET 

hang: 
jmp $ 

gdt: 
NULL_DESC: 
    dd 0   ; null descriptor 
    dd 0 

CODE_DESC: 
    dw 0xFFFF  ; limit low 
    dw 0   ; base low 
    db 0   ; base middle 
    db 10011010b ; access 
    db 11001111b ; granularity 
    db 0   ; base high 

DATA_DESC: 
    dw 0xFFFF  ; data descriptor 
    dw 0   ; limit low 
    db 0   ; base low 
    db 10010010b ; access 
    db 11001111b ; granularity 
    db 0   ; base high 

gdtr: 
    Limit dw 24   ; length of GDT 
    Base dd NULL_DESC ; base of GDT 

msg db "Loading OS", 13, 10, 0 
msgErrorFloppy db "There was an error with the floppy", 13, 10, 0 

FILL: 
times 510-($-$$) db 0 

BOOTSECTOR: 
dw 0xAA55 

Kernel.asm

bits 32 

mov dword [0xB8000], 0x07690748 

jmp $ 

Und compile.bat

nasm -f bin Dev/BootLoader.asm -o Bin/BootLoader.bin 
nasm -f bin Dev/Kernel.asm -o Bin/Kernel.bin 

dd if=Bin/BootLoader.bin of=Image/Image.img seek=0 
dd if=Bin/Kernel.bin of=Image/Image.img seek=1 conv=notrunc 

pause 

Ich benutze Bochs. Und alles, was ich bekomme, ist dies: http://prntscr.com/d24wmm

+8

Umm, das 'Hallo' ist genau dort in der oberen linken Ecke? – Jester

+0

OH mein Gott ich bin eigentlich so blöd: D danke: D poste dies als Antwort –

Antwort

0

Im 32-Bit-geschützten Modus können Sie das BIOS nicht verwenden, da es im 16-Bit-Real-Modus-Code geschrieben ist. Also müssen Sie so den Videospeicher zugreifen:

mov ebx,0xb8000 ; The video address 
    mov al,'!'   ; The character to be print 
    mov ah,0x0F  ; The color: white(F) on black(0) 
    mov [ebx],ax  ; Put the character into the video memory 

Dann können Sie eine ! am Anfang des Bildschirms sehen. Wenn Sie nur an der Cursorposition drucken möchten, können Sie den Cursor wie dieser Versatz erhalten:

mov dx,0x3D4  ; Tell the control I/O port to get the lower byte of 
    mov al,0x0F  ; the cursor offset 
    out dx,al 
    mov dx,0x3D5  ; Switch to data I/O port 
    in al,dx   ; Get the cursor offset's lower byte 

    mov dx,0x3D5  ; Tell the control I/O port to get the higher byte of 
    mov al,0x0E  ; the cursor offset 
    out dx,al 
    mov dx,0x3D5  ; Switch to data I/O port 
    in al,dx   ; Get the higher byte 

    imul ax,2   ; Because a character in video memory costs 2 bytes 
         ; (i.e character and attribute), we need to twice the cursor offset 

In 32-Bit-geschützten Modus, der Code die Effizienz zu erhöhen, könnten Sie einige High-Level-Sprache verwenden wie C, um die Funktionen zu erstellen. Dies erhöhte die Lesbarkeit des Codes.

+0

Dein erster Codeblock speichert nicht im Speicher. Ich denke, Sie haben eine 'mov [ebx], axe 'weggelassen, weil Sie annehmen, dass das Paging deaktiviert oder direkt zugeordnet ist. Und BTW, du hättest 'mov word [0xb8000], (0x0F << 8) | schreiben können "!" –

+0

Außerdem ist 'mul ax, 2' keine x86-Anweisung. "imul ax, 2" ist gültig, aber es zu verwenden, um mit einer Macht von albern zu multiplizieren. Verwende 'shl ax, 1'. Und vergessen Sie nicht, 'eax' zu notieren, bevor Sie' al' und shifting schreiben. –

+0

@PeterCordes danke, ich werde meine Antwort bearbeiten –

Verwandte Themen