Assembleur

Question de moi-même.
Objet : Déterminer logiciellement le microprocesseur d'un l'ordinateur.

Comment puis-je détecter le microprocesseur de l'ordinateur. Cela me permettrai de programmer avec des instructions plus rapide suivant la machine ; ou même d'envisager la programmation protégé, un jours ou j'aurais de la DOC.

Dans la « Bible du PC », nous avons un exemple opérationnel sous DOS et sous Windows (3.11, 95, 98 et même NT). Mais il ne permet de détecter que jusqu'au 386. Matériel (16 Ko) est l'un de mes programmes qui utilise cette exemple.

Bruno, l'un de mes correspondant, m'a envoyé un programme extrait de « l'assembleur pratique » de Bernard Fabrot, au édition Marabout. Il me dite en même temps, que ce programme teste les instructions ne tournant que sur un 186, 286 ... jusqu'au 586. Chaque fois qu'une interruption 6 (l'exception d'instruction illégale) se produit, une variable initialisé à 586, est décrémenté de 100. Telle que je l'ai reçu, ce programme ne fonctionné même pas à la compilation. Après quelque modification, il semble opérationnel. En faite, il fonctionne exclusivement sous DOS, car les exceptions sont détournées par Windows 95/98/NT (J'ai pas essayé sous Win311). Le source est contenue dans l'archive typeproc.zip (1.5 Ko), avec un exécutable compilé avec code de débuggage :

.586P
donnees segment para public use16
vecteur_int6:
dd 0
cpu_type:
dw 586
message:
db 'cet ordinateur est un '
message_suite:
db '586$'
donnees ends
code segment para public use16
assume cs:code,ds:donnees

debut:
mov ax,donnees
mov ds,ax
call set_new_int
call send_old_instructions

mov dx,offset message
mov ah,09h
mov al,0h
int 21h

call set_old_int

mov ax,4c00h
int 21h

set_new_int:
push ds
push es
mov ax,3506h
int 21h
mov word ptr vecteur_int6+2,es ;segment
mov word ptr vecteur_int6,bx ;offset

push ds
mov ax,code
mov ds,ax
mov dx,offset new_int6
mov ax,2506h
int 21h
pop ds

pop es
pop ds
ret
set_old_int:
sti
push ds
lds dx,dword ptr vecteur_int6
mov ax,2506h
int 21h
pop ds
ret

new_int6:
push bp
mov bp,sp
add word ptr ss:[bp+2],3
pop bp
sub word ptr cpu_type,100
dec byte ptr message_suite

mov al,20h ;EOI
out 20h,al
iret

send_old_instructions:
shl ax,5 ;C1 E2 05 186 et +
smsw ax ;0F 01 E2 286 et +
mov eax,cr0 ;0F 20 C2 386 et +
xadd ax,ax ;0F C1 D2 486 et +
cpuid ;0F A2 586 et +
nop ;90
ret

code ends
pile segment para stack use32 'stack'
db 512*16 dup(?)
pile ends
end debut

Si vous avez une autre solution, fonctionnant aussi sous Windows, écrivez-moi, merci.


Dernière mise à jour : dimanche 06 janvier 2008