<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content=text/html;charset=iso-8859-1>
<META content="MSHTML 6.00.6000.16609" name=GENERATOR></HEAD>
<BODY id=MailContainerBody
style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-TOP: 15px"
bgColor=#ffffff leftMargin=0 topMargin=0 CanvasTabStop="true"
name="Compose message area">
<DIV><FONT size=2>Bonjour, je dois utiliser NASM pour créer mon bootsecteur de
OS, et j'ai tenté de copier le code suivant:</FONT></DIV>
<DIV><FONT size=2>[BITS 16]<BR>[ORG 0]<BR>%define BOOT_SEG 7c0h<BR>%define
BOOT_SIZE 512<BR>%define BOOT_STACK_SIZE 4000h<BR>%define BOOT_ADRESS
7c00h<BR>%define BOOT_SEG 7c0h<BR>%define COPY_ADRESS 9f000h<BR>%define COPY_SEG
9f00h<BR>%define LOAD_ADRESS 1000h<BR>%define LOAD_SEG 100h<BR>%define
FINAL_ADDRESS 200000h<BR>%define MAX_KERN_LEN 9e000h<BR>%define CYLS
80<BR>%define HEADS 1<BR>%define SECTS 18<BR>global
_bsect<BR>_bsect:<BR> mov ax, BOOT_SEG<BR> mov ds, ax<BR> xor
si,si<BR> xor di,di<BR> mov cx, (BOOT_SIZE>>1)<BR> mov ax,
COPY_SEG<BR> mov es,ax<BR> cld<BR> rep movsw<BR> jmp
COPY_SEG:here<BR>here:<BR> mov ds,ax<BR> mov ss,ax<BR> mov sp,
(LOAD_ADRESS-10h)<BR> xor ah,ah<BR> mov al,3h<BR> int
10h<BR> mov si, kld<BR> call message<BR>copykernel:<BR> xor
dl,dl<BR> mov ax, LOAD_SEG<BR> mov es,ax<BR> xor
bx,bx<BR> xor dx,dx<BR> mov cx,1<BR>.nextsector:<BR> inc
cl<BR> cmp cl, SECTS<BR> jbe .sector<BR> mov cl,1<BR> inc
dh<BR> cmp dh,1<BR> je .sector<BR> xor dh,dh<BR> inc
ch<BR>.sector:<BR> push es<BR> mov ax,0201h<BR> int
13h<BR> jc halt<BR> pop ax<BR> add ax,32<BR> mov
es,ax<BR> mov ax,(0x0E*256+'.')<BR> int 10h<BR> dec word
[ldsz]<BR> jnz .nextsector<BR>after:<BR> mov dx,03f2h<BR> in
al,dx<BR> and al,0fh<BR> out
dx,al<BR> cli<BR>fincopie:<BR> push cs<BR> pop ds<BR> call
waitkb<BR> mov al,0d1h<BR> out 64h,al<BR> call
waitkb<BR> mov al,0dfh<BR> out 60h, al<BR> mov
si,kld2<BR> call message<BR>InitGDT:<BR> lgdt
[ds:gdtr]<BR>GoPMode:<BR> mov eax,cr0<BR> or al,1<BR> mov
cr0,eax<BR> mov ax,10h<BR> mov ds,ax<BR> mov es,ax<BR> mov
fs,ax<BR> mov gs,ax<BR>[BITS 32]<BR>JumpToHere32:<BR> db
66h<BR> jmp 8h: (COPY_ADRESS+Here32)<BR>halt:<BR> jmp
$<BR>Here32:<BR>MoveKernelToFinalAddr:<BR> mov eax, 10h<BR> mov ds,
eax<BR> mov es, eax<BR> cld<BR> mov esi, LOAD_ADRESS<BR> mov
edi, FINAL_ADDRESS<BR> mov ecx, MAX_KERN_LEN<BR> shr ecx,
2<BR> rep movsd<BR>LaunchKernel:<BR> mov ss,eax<BR> mov ebp,
9e000h<BR> mov esi, FINAL_ADDRESS+200h<BR> mov esp, ebp <BR> jmp
esi</FONT></DIV><FONT size=2>
<DIV><BR>;dummy utilities for 32bit<BR>;Halt method 1: Instant
jump<BR>haltP:<BR> jmp $<BR>;Halt method 2: infine loop of
HLT.<BR>haltS:<BR> hlt<BR> jmp haltS<BR>;Clears the screen in
black<BR>cls:<BR> xor eax,eax<BR> mov edi, 0b8000h<BR> mov ecx,
1000<BR> rep stosd<BR> ret<BR>;Write AL value in HEX on the screen,
with a trailing space<BR>writemsg:<BR> mov ah, 30<BR> mov al,
dl<BR> shr al,4<BR> call .subwrite<BR> mov al,dl<BR> and al,
0Fh<BR> call .subwrite<BR> mov al, '
'<BR> stosw<BR> ret<BR>.subwrite<BR> cmp al,10<BR> jb
.case2<BR>.case1:<BR> add al, 55<BR> jmp
.after<BR>.case2:<BR> add al,
48<BR>.after:<BR> stosw<BR> ret<BR>[BITS
16]<BR>message:<BR> lodsb<BR> or al,al<BR> jz
.endmsg<BR> mov ah,0eh<BR> mov bx,07h<BR> int 10h<BR> jmp
message<BR>.endmsg<BR> ret<BR>waitkb:<BR> dw 0ebh<BR> dw
0ebh<BR> in al,64h<BR> and al,02h<BR> jnz
waitkb<BR> ret<BR>;PMODE switch & GDT
init.<BR>gdt:<BR>gdtr:<BR>NULL_desc:<BR> dw EndGDT-gdt-1<BR> dd
gdt+COPY_ADRESS<BR>unused:<BR> dw 0<BR>CS_Desc:<BR> dw 0FFFFh,
0<BR> db 0,9Bh, 0CFh, 0<BR>DS_Desc:<BR> dw 0FFFFh, 0<BR> db 0,
93h, 0CFh, 0<BR>EndGDT:<BR>kld db "Loading...",0<BR>kld2 db "OK!",0<BR>khlt db
"Halt!",0<BR>ldsz dw MAX_KERN_LEN>>9<BR>times 510-($-$$) db 0<BR>db
0x55<BR>db 0xAA</DIV>
<DIV> </DIV>
<DIV>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)).</DIV>
<DIV> </DIV>
<DIV>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. </DIV>
<DIV>Par contre, la copie ne semble pas fonctionner. Le saut s'exécute .... puis
rien ne se passe.</DIV>
<DIV> </DIV>
<DIV>Merci d,avance !</FONT></DIV></BODY></HTML>