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 |