[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