natürlich habe mir nur gedacht es ist ein bisschen viel
ok ich hänge direcht an die bienärdatei eine 32bit binaerdatei an und schreibe diese in ein img und boote dies mit qemu und virtual box
[ORG 0] ;ab hier Startet das Programm
[bits 16]
jmp 07C0h:start ; Goto segment 07C0
start:
; Update the segment registers
mov ax, cs
mov ds, ax
mov es, ax
call print
mov ax,$
call int2string
call print
;mov ah,86h ;Wartet eine gewisse Zeit ab
;mov al,0
;mov cx,200
;mov dx,0
;int 15h
;================================================================
;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, 1000h ; ES:BX = 1000:0000
mov es, ax ;
mov bx, 0000h ;
mov ah, 2 ; Load disk data to ES:BX
mov al, 3 ; Load 3 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
;================================================================
;Schalte in den Protected Mode
;================================================================
[BITS 16]
org 0x0000 ; Addiert zu allen Offsets die Start-Adresse dieses Codes
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
int 19h
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
jmp $ ; Endlosschleife, wird durch weiteren Code ersetzt
jmp 1000h:0200h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; == 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:
;================================================================
; int2string (schreibt eax in den string)
;================================================================
[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 dl,ah
MOV ah,al
MOV al,dl
MOV [esi], ah
MOV [edi], al
DEC edi
MOV al, [edi]
CMP al,ah
JA ende0
INC esi
MOV ah, [esi]
CMP al,ah
JA ende0
ende0:
POPA
RET
;================================================================
; end int2string
;================================================================
;================================================================
; Print
;================================================================
string DB "Lade Black Window 0.0.0.0.0.0.0.5.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
;================================================================
;================================================================
;Schreibe die Bootloaderidentifikation
;================================================================
times 510-($-$$) db 0
dw 0AA55h
;================================================================
;ende Schreibe die Bootloaderidentifikation
;================================================================
zum umschalten habe ich noch die alternative:
lgdt [gdtr]
mov eax, cr0
or al, 1
mov cr0, eax
; Reprogram 8259A interrupt controller chips, taken from skelix.org
mov dx, 011h
mov al, 020h
out dx, al
mov al, 0a0h
out dx, al
mov dx, 020h
mov al, 021h
out dx, al
mov dx, 028h
mov al, 0a1h
out dx, al
mov dx, 004h
mov al, 021h
out dx, al
mov dx, 002h
mov al, 0a1h
out dx, al
mov dx, 001h
mov al, 021h
out dx, al
mov al, 0a1h
out dx, al
mov dx, 0ffh
mov al, 021h
out dx, al
mov al, 0a1h
out dx, al
jmp SYS_CODE_SEL:do_pm
[BITS 32] ; All code from now on will be 32-bit
do_pm:
mov ax, SYS_DATA_SEL ; Update the segment registers
mov ds, ax ; To complete the transfer to
mov es, ax ; 32-bit mode
mov ss, ax
; Update ESP
mov esp, 9000h
; -------------------------------------------------------
; Execute the binary file that was loaded previously
; -------------------------------------------------------
jmp 08000h
gdtr:
dw gdt_end - gdt - 1 ; GDT limit
dd gdt ; GDT base
; -----------------------------------------------
; GDT
; -----------------------------------------------
gdt:
times 8 db 0 ; NULL Descriptor
SYS_CODE_SEL equ $-gdt
dw 0xFFFF ; limit 15:0
dw 0 ; base 15:0
db 0 ; base 23:16
db 0x9A ; type = present, ring 0, code, non-conforming, readable
db 0xCF ; page granular, 32-bit
db 0 ; base 31:24
SYS_DATA_SEL equ $-gdt
dw 0xFFFF ; limit 15:0
dw 0 ; base 15:0
db 0 ; base 23:16
db 0x92 ; type = present, ring 0, data, expand-up, writable
db 0xCF ; page granular, 32-bit
db 0 ; base 31:24
gdt_end:
danke für die schnelle antwort