<!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>&nbsp;</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;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>&nbsp;&nbsp;&nbsp;&nbsp;Il rest encore quelques points à éclaircir en ce 
qui concerne le code ci-dessous. Notamment l'instruction suivante:</DIV>
<DIV>&nbsp;</DIV>
<DIV align=center><STRONG>asm("":::"memory");</STRONG></DIV>
<DIV>&nbsp;</DIV>
<DIV>Que veut-elle dire ?</DIV>
<DIV>Quelle est son rôle ?</DIV>
<DIV>&nbsp;</DIV>
<DIV>Et voilà le code pour Thomas avec l'instruction "wbinvd":</DIV>
<DIV>&nbsp;</DIV>
<DIV><STRONG>unsigned long count_memory(void)<BR>{<BR>&nbsp;register unsigned 
long *mem;<BR>&nbsp;unsigned long mem_count, mem_end, bse_end, 
a;<BR>&nbsp;unsigned short memkb;<BR>&nbsp;unsigned char irq1, 
irq2;<BR>&nbsp;unsigned long cr0;</STRONG></DIV>
<DIV><STRONG></STRONG>&nbsp;</DIV>
<DIV><STRONG>&nbsp;irq1=inb(0x21);<BR>&nbsp;irq2=inb(0xA1);</STRONG></DIV>
<DIV><STRONG></STRONG>&nbsp;</DIV>
<DIV><STRONG>&nbsp;outb(0x21, 0xFF);<BR>&nbsp;outb(0xA1, 0xFF);</STRONG></DIV>
<DIV><STRONG></STRONG>&nbsp;</DIV>
<DIV><STRONG>&nbsp;mem_count=0;<BR>&nbsp;memkb=0;</STRONG></DIV>
<DIV><STRONG></STRONG>&nbsp;</DIV>
<DIV><STRONG>&nbsp;asm volatile ("wbinvd");</STRONG></DIV>
<DIV><STRONG></STRONG>&nbsp;</DIV>
<DIV><STRONG>&nbsp;do<BR>&nbsp;{<BR>&nbsp;&nbsp;memkb++;<BR>&nbsp;&nbsp;mem_count+=1024*1024;<BR>&nbsp;&nbsp;mem=(unsigned 
long*)mem_count;</STRONG></DIV>
<DIV><STRONG></STRONG>&nbsp;</DIV>
<DIV><STRONG>&nbsp;&nbsp;a=*mem;</STRONG></DIV>
<DIV><STRONG></STRONG>&nbsp;</DIV>
<DIV><STRONG>&nbsp;&nbsp;*mem=0x55AA55AA;</STRONG></DIV>
<DIV><STRONG></STRONG>&nbsp;</DIV>
<DIV><STRONG>&nbsp;&nbsp;asm("":::"memory");<BR>&nbsp;&nbsp;if(*mem!=0x55AA55AA)<BR>&nbsp;&nbsp;&nbsp;mem_count=0;<BR>&nbsp;&nbsp;else<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;*mem=0xAA55AA55;<BR>&nbsp;&nbsp;&nbsp;asm("":::"memory");<BR>&nbsp;&nbsp;&nbsp;if(*mem!=0xAA55AA55)<BR>&nbsp;&nbsp;&nbsp;&nbsp;mem_count=0;<BR>&nbsp;&nbsp;}</STRONG></DIV>
<DIV><STRONG></STRONG>&nbsp;</DIV>
<DIV><STRONG>&nbsp;&nbsp;asm("":::"memory");<BR>&nbsp;&nbsp;*mem=a;<BR>&nbsp;} 
while(memkb&lt;4096 &amp;&amp; mem_count!=0);</STRONG></DIV>
<DIV><STRONG></STRONG>&nbsp;</DIV>
<DIV><STRONG>&nbsp;mem_end=memkb&lt;&lt;10;<BR>&nbsp;mem=(unsigned 
long*)0x413;<BR>&nbsp;bse_end=((*mem)&amp;0xFFFF)&lt;&lt;6;</STRONG></DIV>
<DIV><STRONG></STRONG>&nbsp;</DIV>
<DIV><STRONG>&nbsp;outb(0x21, irq1);<BR>&nbsp;outb(0xA1, irq2);</STRONG></DIV>
<DIV><STRONG></STRONG>&nbsp;</DIV>
<DIV><STRONG>&nbsp;return mem_end;<BR>}</STRONG></DIV>
<DIV>&nbsp;</DIV>
<DIV>Krys.</DIV></FONT></BODY></HTML>