8
« am: 13. May 2010, 17:30 »
ok dann kurz einen bootloader:
[ORG 07C00h] ;ab hier Startet das Programm
[bits 16]
jmp 0000h:start
start:
; Update the segment registers
mov ax, cs
mov ds, ax
mov es, ax
call print
;================================================================
;Lade das weitere Programm in den Arbeitsspeicher
;================================================================
reset: ; Reset the floppy drive
mov ax, 0 ;
mov dl, 0 ; Drive=0 (=A)
int 13h ;
jc reset ; ERROR => reset again
read:
mov ax, 0x0050 ; ES:BX = 0050:0000
mov es, ax ;
mov bx, 0x0000 ;
mov ah, 2 ; Load disk data to ES:BX
mov al, 5 ; Load 5 sectors
mov ch, 0 ; Cylinder=0
mov cl, 1 ; Sector=1
mov dh, 0 ; Head=0
mov dl, 0 ; Drive=0
int 13h ; Read!
jc read ; ERROR => Try again
;================================================================
;Das weitere Programm wurde in den Arbeitsspeicher geladen
;Schalte in den Protected Mode
;================================================================
[BITS 16]
cli ; Interrupts ausschalten
lgdt [gdtr] ; GDT Pointer laden
mov eax,cr0 ; In PMode wechseln, indem das niedrigste
or al,1 ; Steuerungsbit von cr0 geändert wird
mov cr0,eax ; muss über Umweg über ein anderes Register gemacht werden
jmp codesel:PMode ; FarJump zu einer 32-Bit PMode Funktion
[BITS 32]
PMode:
mov ax,datasel ; Segmentregister laden
mov ds,ax
mov ss,ax
mov esp,0x90000 ; Stack aufsetzen
mov eax, 1 ; Zeile
mov ebx, 0 ; Spalte
call print32
jmp 0x0500+512
;================================================================
;Das Programm ist nun im Protected Modus
;GDT
;================================================================
gdtr: ; Desktiptortabelle
dw gdt_end-gdt-1 ; Limit
dd gdt ; Basisadresse
gdt:
dd 0,0 ; Null-Deskriptor
codesel equ $-gdt
dw 0xFFFF ; Segmentgrösse 0..15
dw 0x0000 ; Segmentadresse 0..15
db 0x00 ; Segmentadresse 16..23
db 0x9A ; Zugriffsberechtigung und Typ
db 0xCF ; Zusatzinformationen und Segmentgrösse 16...19
db 0x00 ; Segmentadresse 24..31
datasel equ $-gdt
dw 0xFFFF ; Segmentgrösse 0..15
dw 0x0000 ; Segmentadresse 0..15
db 0x00 ; Segmentadresse 16..23
db 0x92 ; Zugriffsberechtigung und Typ
db 0xCF ; Zusatzinformationen und Segmentgrösse 16...19
db 0x00 ; Segmentadresse 24..31
gdt_end:
;================================================================
;GDT ende
;================================================================
;================================================================
; int2string (schreibt eax in den string)
; eax = number
;================================================================
[bits 16]
int2string:
PUSHA
LEA edi,[string]
MOV esi, edi
;MOV eax, 479
MOV ecx, 0x000A
startLoop:
MOV byte [edi], '0'
XOR edx,edx
DIV ecx
ADD [edi],edx
;MOV byte [edi], ebx
;ADD [edi],ebx
INC edi
CMP eax,0
JNE startLoop
MOV byte [edi],0
DEC edi
; vertausche die Richtung
switchLoop:
MOV ah, [esi]
MOV al, [edi]
MOV [esi], al
MOV [edi], ah
DEC edi
INC esi
CMP edi,esi
JA switchLoop
POPA
RET
;================================================================
; end int2string
;================================================================
;================================================================
; Print 16
;================================================================
string DB "Lade Black Window 0.0.0.0.0.0.0.6.0",0
print:
PUSHA
LEA bx,[string]
startOutLoop:
CMP byte [bx],0
JE ende
MOV ah,0eh
MOV al,[bx]
INT 10h
INC bx
JMP startOutLoop
ende:
MOV bh, 0
MOV ah, 03h
INT 10h
MOV ah, 02h
MOV dl, 0
INC dh
INT 10h
POPA
RET
;================================================================
; end Print
;================================================================
;================================================================
; Print 32
; eax = Line
; ebx = Position
;================================================================
[bits 32]
string32 DB "32 Bit Protected Modus geladen ",0
print32:
pusha
mov edx,0x50
mul edx
add eax,ebx
mov edx,0x2
mul edx
add eax,0xb8000
lea edx,[string32]
.paintloop:
mov cl,[edx]
mov byte [eax],cl
inc edx
add eax,0x2
cmp byte [edx],0
jne .paintloop
popa
ret
[bits 16]
;================================================================
; end Print
;================================================================
;================================================================
;Schreibe die Bootloaderidentifikation
;================================================================
times 440-($-$$) db 0
dq 0x00000000 ;Optional Disk Signatur
dw 0x0000 ;Usually Nulls
;Table of primary partitions
times 510-($-$$) db 0
bootloaderIdentifikation dw 0x0AA55
;================================================================
;ende Schreibe die Bootloaderidentifikation
;================================================================
aber wie kann ich den mit grub ersetzten
da müsste ich mir immerwieder einen grub auf mein img laden