<!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.2600.0" name=GENERATOR></HEAD>
<BODY id=role_body style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Arial"
bottomMargin=7 leftMargin=7 topMargin=7 rightMargin=7><FONT id=role_document
face=Arial color=#000000 size=2>
<DIV>Bonjour,</DIV>
<DIV> </DIV>
<DIV> Pour répondre à la question de Thomas, voilà dans
quoi j'ai trouvé l'instruction "wbinvd". J'ai trouvé cette instruction dans une
fonction qui "probe" la mémoire. Cette onction est une alternative aux
interruptions. En effet, sur certaines configurations mémoires, les
interruptions ne renvoie pas une image correcte de la taille mémoire. Quand je
parle de la mémoire, je parle de celle située au-delà des 1 Mo que l'on nomme
extended memory ou mémoire étendue.</DIV>
<DIV> Il rest encore quelques points à éclaircir en ce
qui concerne le code ci-dessous. Notamment l'instruction suivante:</DIV>
<DIV> </DIV>
<DIV align=center><STRONG>asm("":::"memory");</STRONG></DIV>
<DIV> </DIV>
<DIV>Que veut-elle dire ?</DIV>
<DIV>Quelle est son rôle ?</DIV>
<DIV> </DIV>
<DIV>Et voilà le code pour Thomas avec l'instruction "wbinvd":</DIV>
<DIV> </DIV>
<DIV><STRONG>unsigned long count_memory(void)<BR>{<BR> register unsigned
long *mem;<BR> unsigned long mem_count, mem_end, bse_end,
a;<BR> unsigned short memkb;<BR> unsigned char irq1,
irq2;<BR> unsigned long cr0;</STRONG></DIV>
<DIV><STRONG></STRONG> </DIV>
<DIV><STRONG> irq1=inb(0x21);<BR> irq2=inb(0xA1);</STRONG></DIV>
<DIV><STRONG></STRONG> </DIV>
<DIV><STRONG> outb(0x21, 0xFF);<BR> outb(0xA1, 0xFF);</STRONG></DIV>
<DIV><STRONG></STRONG> </DIV>
<DIV><STRONG> mem_count=0;<BR> memkb=0;</STRONG></DIV>
<DIV><STRONG></STRONG> </DIV>
<DIV><STRONG> asm volatile ("wbinvd");</STRONG></DIV>
<DIV><STRONG></STRONG> </DIV>
<DIV><STRONG> do<BR> {<BR> memkb++;<BR> mem_count+=1024*1024;<BR> mem=(unsigned
long*)mem_count;</STRONG></DIV>
<DIV><STRONG></STRONG> </DIV>
<DIV><STRONG> a=*mem;</STRONG></DIV>
<DIV><STRONG></STRONG> </DIV>
<DIV><STRONG> *mem=0x55AA55AA;</STRONG></DIV>
<DIV><STRONG></STRONG> </DIV>
<DIV><STRONG> asm("":::"memory");<BR> if(*mem!=0x55AA55AA)<BR> mem_count=0;<BR> else<BR> {<BR> *mem=0xAA55AA55;<BR> asm("":::"memory");<BR> if(*mem!=0xAA55AA55)<BR> mem_count=0;<BR> }</STRONG></DIV>
<DIV><STRONG></STRONG> </DIV>
<DIV><STRONG> asm("":::"memory");<BR> *mem=a;<BR> }
while(memkb<4096 && mem_count!=0);</STRONG></DIV>
<DIV><STRONG></STRONG> </DIV>
<DIV><STRONG> mem_end=memkb<<10;<BR> mem=(unsigned
long*)0x413;<BR> bse_end=((*mem)&0xFFFF)<<6;</STRONG></DIV>
<DIV><STRONG></STRONG> </DIV>
<DIV><STRONG> outb(0x21, irq1);<BR> outb(0xA1, irq2);</STRONG></DIV>
<DIV><STRONG></STRONG> </DIV>
<DIV><STRONG> return mem_end;<BR>}</STRONG></DIV>
<DIV> </DIV>
<DIV>Krys.</DIV></FONT></BODY></HTML>