Como detectar tecnologia MMX
--------------------------------------
by Elektro

Como podem ver este artigo nao esta directamente relacionado com o hacking puro e duro como toda a gente gosta!:)) Porem, e como esta no titulo este artigo e apenas uma curiosidade!

E' facil encontrar, em qualquer site que dedique um pouco de espaco a' programacao em assembly, pequenos programas ou rotinas que se destinam a' determinacao da familia a que pertence o processador onde o codigo esta a correr (alguns trabalhos mais completos como e' o caso do famoso codigo disponibilizado pela propria Intel, permitem inclusive testar a presenca de co-processador matematico (FPU - floating point unit)).

No entanto ainda nao encontrei nenhuma rotina que permitisse determinar a existencia ou nao, de tecnologia MMX!

Com certeza sabem o que sao as tao famosas, e desejadas, extensoes multimedia, designadas por extensoes MMX! Se nao sabem estao com azar, pois esta fora do ambito deste artigo, estar a explicar pormenorizadamente as inovacoes trazidas pelas novas instrucoes MMX, porem podem-se salientar assim por alto algumas vantagens:

- Melhoramento do pipeline (processamento paralelo)
- Tecnologia SIMD (Single Instruction Multiple Data)
- Melhoramento da gestao de acessos a' memoria
etc...

Bla, bla, bla...isto nao e nada de novo!

Tornou-se entao necessario criar rotinas que permitissem ao software determinar a existencia ou nao destas extensoes.

Entao o que os programas preparados para usufruir destas extensoes fazem e terem todas as rotinas em duplicado:

Uma parte com codigo preparado para tirar todo o partido da tecnologia MMX, e outra parte para correr com o set de instrucoes de um Pentium normal!

Em que consiste entao esta "maneira" de verificar a existencia de MMX:

- Com o aparecimento dos processadores Pentium, surgiu uma instrucao CPUID, que permite ao software reconhecer o processador corrente!

Ora, o dominio desta funcao, assim lhe poderemos chamar pois e o que vai determinar o que a instrucao ira fazer, e' o valor do registo de 32 bits EAX! E' assim que se detecta a existencia de MMX:

Se pusermos o valor 1 em EAX, ao chamarmos a instrucao CPUID, se as extensoes estiverem presentes, o bit 23 do registo EDX ficara 1! Caso contrario,...nao e um Pentium MMX!!
Simples nao e'????

Em baixo encontra-se entao o programa, que mostra como isto tudo o que foi descrito, se passa na "vida real"!:)

O programa tambem detecta se o processador corrente e um "puro Intel": tambem esta utilidade se deve a' instrucao CPUID, basta colocar em EAX o valor 0 (zero), que se se tratar de um "puro Intel", sera colo- cada ao longo dos registos EBX, EDX e ECX a string "GenuineIntel". Dai' o facto de no codigo se comparar o registo bl (8 bits) com o caracter 'G'.

Mais uma vez, digo que este artigo nao esta relacionado directamente com o hacking, porem e um empurrao para o desenvolvimento de aplicacoes, cada vez mais poderosas e rapidas!!

Aqui esta o programa ja compilado - mmx.exe .

--------------------------------CORTE AQUI-------------------------------

;   Por Elektro (elektro@null.net)
;
;   Este pequeno excerto de codigo apenas detecta a existencia de tecnologia
; MMX, em processadores Pentium (caso o processador currente seja um genuino
; Intel).
;
;   IMPORTANTE: este codigo apenas corre em maquinas com processadores
;               Pentium!!
;               Caso seja corrido em maquinas inferiores ocorrera e excepcao
;               6 (codigo de instrucao invalido)!


 TITLE CPUID
 .model tiny
 .stack
 .586

         .data
 GENUINO db "GenuineIntel(TM)", 13,10,"$"
 SIM_MMX db "Possui extensoes MMX", 13,10,"$"
 NAO_MMX db "Nao possui extensoes MMX", 13,10,"$"
 NAO_INTELP db "Este processador nao e um genuino Intel!!", 13,10,"$"

          ;inicio
start:     mov ax,@data
           mov ds,ax

           mov eax,0
           cpuid
           cmp bl,'G'
           jnz nao_intel
           mov dx,OFFSET GENUINO
           mov ah,9h
           int 21h
           mov eax,1
           cpuid
           test edx,00800000h  ;mask -> bit 23 ser 1
           je not_mmx
           mov dx,OFFSET SIM_MMX
           mov ah,9h
           int 21h
           jmp fim
nao_intel: mov dx,OFFSET NAO_INTELP
           mov ah,9h
           int 21h
           jmp fim
not_mmx:   mov dx,OFFSET NAO_MMX
           mov ah,9h
           int 21h
fim:       mov ax,4c00h
           int 21h
           
           end start