[SOS] Bootsecteur et NASM
David
mykeysdavid at gmail.com
Sam 5 Avr 03:42:01 CEST 2008
Bonjour, je dois utiliser NASM pour créer mon bootsecteur de OS, et j'ai tenté de copier le code suivant:
[BITS 16]
[ORG 0]
%define BOOT_SEG 7c0h
%define BOOT_SIZE 512
%define BOOT_STACK_SIZE 4000h
%define BOOT_ADRESS 7c00h
%define BOOT_SEG 7c0h
%define COPY_ADRESS 9f000h
%define COPY_SEG 9f00h
%define LOAD_ADRESS 1000h
%define LOAD_SEG 100h
%define FINAL_ADDRESS 200000h
%define MAX_KERN_LEN 9e000h
%define CYLS 80
%define HEADS 1
%define SECTS 18
global _bsect
_bsect:
mov ax, BOOT_SEG
mov ds, ax
xor si,si
xor di,di
mov cx, (BOOT_SIZE>>1)
mov ax, COPY_SEG
mov es,ax
cld
rep movsw
jmp COPY_SEG:here
here:
mov ds,ax
mov ss,ax
mov sp, (LOAD_ADRESS-10h)
xor ah,ah
mov al,3h
int 10h
mov si, kld
call message
copykernel:
xor dl,dl
mov ax, LOAD_SEG
mov es,ax
xor bx,bx
xor dx,dx
mov cx,1
.nextsector:
inc cl
cmp cl, SECTS
jbe .sector
mov cl,1
inc dh
cmp dh,1
je .sector
xor dh,dh
inc ch
.sector:
push es
mov ax,0201h
int 13h
jc halt
pop ax
add ax,32
mov es,ax
mov ax,(0x0E*256+'.')
int 10h
dec word [ldsz]
jnz .nextsector
after:
mov dx,03f2h
in al,dx
and al,0fh
out dx,al
cli
fincopie:
push cs
pop ds
call waitkb
mov al,0d1h
out 64h,al
call waitkb
mov al,0dfh
out 60h, al
mov si,kld2
call message
InitGDT:
lgdt [ds:gdtr]
GoPMode:
mov eax,cr0
or al,1
mov cr0,eax
mov ax,10h
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
[BITS 32]
JumpToHere32:
db 66h
jmp 8h: (COPY_ADRESS+Here32)
halt:
jmp $
Here32:
MoveKernelToFinalAddr:
mov eax, 10h
mov ds, eax
mov es, eax
cld
mov esi, LOAD_ADRESS
mov edi, FINAL_ADDRESS
mov ecx, MAX_KERN_LEN
shr ecx, 2
rep movsd
LaunchKernel:
mov ss,eax
mov ebp, 9e000h
mov esi, FINAL_ADDRESS+200h
mov esp, ebp
jmp esi
;dummy utilities for 32bit
;Halt method 1: Instant jump
haltP:
jmp $
;Halt method 2: infine loop of HLT.
haltS:
hlt
jmp haltS
;Clears the screen in black
cls:
xor eax,eax
mov edi, 0b8000h
mov ecx, 1000
rep stosd
ret
;Write AL value in HEX on the screen, with a trailing space
writemsg:
mov ah, 30
mov al, dl
shr al,4
call .subwrite
mov al,dl
and al, 0Fh
call .subwrite
mov al, ' '
stosw
ret
.subwrite
cmp al,10
jb .case2
.case1:
add al, 55
jmp .after
.case2:
add al, 48
.after:
stosw
ret
[BITS 16]
message:
lodsb
or al,al
jz .endmsg
mov ah,0eh
mov bx,07h
int 10h
jmp message
.endmsg
ret
waitkb:
dw 0ebh
dw 0ebh
in al,64h
and al,02h
jnz waitkb
ret
;PMODE switch & GDT init.
gdt:
gdtr:
NULL_desc:
dw EndGDT-gdt-1
dd gdt+COPY_ADRESS
unused:
dw 0
CS_Desc:
dw 0FFFFh, 0
db 0,9Bh, 0CFh, 0
DS_Desc:
dw 0FFFFh, 0
db 0, 93h, 0CFh, 0
EndGDT:
kld db "Loading...",0
kld2 db "OK!",0
khlt db "Halt!",0
ldsz dw MAX_KERN_LEN>>9
times 510-($-$$) db 0
db 0x55
db 0xAA
Je tente de faire un OS en utilisant Visual Studio, et cela semble vouloir fonctionner, sauf que je me bute à un problème car le linker VS ne reconnait pas le code 16 bit (d'où mon utilisation de NASM). Je génère un fichier binaire pur contenant à la chaîne le bootsecteur et un code en C qui efface l'ecran (une fonction assembleur comme cls dans le code ci dessus (fonctionnel)).
D'après mes analyses, le passage en mode protégé semble fonctionner, le code 32 bit s'éxécute parfaitement et l'écran est effacé si j'appelle la fonction cls.
Par contre, la copie ne semble pas fonctionner. Le saut s'exécute .... puis rien ne se passe.
Merci d,avance !
-------------- section suivante --------------
Une pièce jointe HTML a été nettoyée...
URL: http://the-doors.enix.org/pipermail/sos/attachments/20080404/9db8997d/attachment.htm
Plus d'informations sur la liste de diffusion Sos