View Full Version : [Asmx86]Flag
; Source name :
; Executable name :
; Code model: : Real mode flat model
; Version :
; Created date :
; Last update :
; Author : Luca Francesca
; Description : A utility to query and display information about CPU
; Compiling on : NASM
[BITS 16]
[ORG 0100h] ; for .com
[SECTION .text]
start:
mov dx, Title
mov ah, 09h
int 21h
mov dx, NewLine
mov ah, 09h
int 21h
mov dx, Name
mov ah, 09h
int 21h
mov eax, 80000002h
cpuid
mov [ProcessorStr], eax
mov [ProcessorStr+4], ebx
mov [ProcessorStr+8], ecx
mov [ProcessorStr+12], edx
mov eax, 80000003h
cpuid
mov [ProcessorStr+16], eax
mov [ProcessorStr+20], ebx
mov [ProcessorStr+24], ecx
mov [ProcessorStr+28], edx
mov byte [ProcessorStr+32], 13 ; CR
mov byte [ProcessorStr+33], 10 ; LF
mov byte [ProcessorStr+34], '$' ; String termining
mov dx, ProcessorStr
mov ah, 09h
int 21h
mov eax, 1h
cpuid
mov dx, Fam
mov ah, 09h
int 21h
;bits 11-8 (reg_eax & 0xf00) >> 8;
mov dx, NewLine
mov ah, 09h
int 21h
mov dx, Mod
mov ah, 09h
int 21h
;bits 7-4 f0 (reg_eax & 0xf0) >> 4;
mov dx, NewLine
mov ah, 09h
int 21h
mov dx, NewLine
mov ah, 09h
int 21h
mov dx, Vendor
mov ah, 09h
int 21h
mov eax, 0h
cpuid
mov [VendorStr], ebx
mov [VendorStr+4], edx
mov [VendorStr+8], ecx
mov byte [VendorStr+12], 13 ; CR
mov byte [VendorStr+13], 10 ; LF
mov byte [VendorStr+14], '$' ; String termining
mov dx, VendorStr
mov ah, 09h
int 21h
mov dx, NewLine
mov ah, 09h
int 21h
mov dx, Ext
mov ah, 09h
int 21h
; extension info
mov eax, 1h
cpuid
test edx, 00800000h ; MMX bit(23)
jnz MMX
xor eax, eax
test edx, 002000000h ; SSE bit(25)
jnz SSE
xor eax, eax
test edx, 004000000h ; SSE2 bit(26)
jnz SSE_TWO
xor eax, eax
test ecx, 000000001h ; SSE3 bit(0)
jnz SSE_THREE
xor eax, eax
test edx, 0040000000h ; 3DNow! bit(30)
jnz AMD_NOW
xor eax, eax
test edx, 0080000000; 3DNow! Extensions bit(31)
jnz AMD_NOW_EXT
xor eax, eax
; exit to the program
jmp exit
MMX:
mov dx, MMXMsg
mov ah, 09h
int 21h
SSE:
mov dx, SSEMsg
mov ah, 09h
int 21h
SSE_TWO:
mov dx, SSE_TWOMsg
mov ah, 09h
int 21h
SSE_THREE:
mov dx, SSE_THREEMsg
mov ah, 09h
int 21h
AMD_NOW:
mov dx, AMD_NOWMsg
mov ah, 09h
int 21h
AMD_NOW_EXT:
mov dx, AMD_NOW_EXTMsg
mov ah, 09h
int 21h
exit:
; set int 21h service 4Ch(exit)
mov ah, 4Ch
int 21h
[SECTION .data]
NewLine db 13, 10, '$'
Title db "§§§§§ Lucas CPUID program §§§§§", 13, 10, '$'
Name db "=> Cpu Name: ", '$'
Vendor db "=> Cpu Vendor: ", '$'
Ext db "=> Cpu supported extension:", 13, 10, '$'
Fam db "==> Cpu Family: ", '$'
Mod db "===> Cpu Model: ", '$'
; Intel specific instruction
MMXMsg db "*This CPU support the 'MMX' instructions", 13, 10, '$'
SSEMsg db "*This CPU support the 'SSE' instructions", 13, 10, '$'
SSE_TWOMsg db "*This CPU support the 'SSE2' instructions", 13, 10, '$'
SSE_THREEMsg db "*This CPU support the 'SSE3' instructions", 13, 10, '$'
; AMD specific instructions
AMD_NOWMsg db "*This CPU support the '3DNow!' instructions", 13, 10, '$'
AMD_NOW_EXTMsg db "*This CPU support the '3DNow!+ Extensions' instructions", 13, 10, '$'
[SECTION .bss]
VendorStr resb 14 ; Reserve 12 bytes for cpu's vendor string
ProcessorStr resb 34 ; Reserve 31 +3(\n) bytes for cpu's vendor string
Family resb 7 ; 4 + 3(\n)
Model resb 7 ; 4 + 3(\n)
Ma il risultato è:
§§§§§ Lucas CPUID program §§§§§
=> Cpu Name: AMD Athlon(tm) XP 2600+
==> Cpu Family:
===> Cpu Model:
=> Cpu Vendor: AuthenticAMD
=> Cpu supported extension:
*This CPU support the 'MMX' instructions
*This CPU support the 'SSE' instructions
*This CPU support the 'SSE2' instructions
*This CPU support the 'SSE3' instructions
*This CPU support the '3DNow!' instructions
*This CPU support the '3DNow!+ Extensions' instructions
Sia le SSE2 che le SSE3 extensions nn sono supportate dalla mia cpu...... allora perche mi da il supporto???
Originariamente inviato da Luc@s
[...]
MMX:
mov dx, MMXMsg
mov ah, 09h
int 21h
[...]
Uhm non è che alla fine di questi blocchi qui dove stampi il messaggio ti sei scordato di tornare al flusso principale del programma. :confused:
ciao ;)
Originariamente inviato da VICIUS
Uhm non è che alla fine di questi blocchi qui dove stampi il messaggio ti sei scordato di tornare al flusso principale del programma. :confused:
ciao ;)
ho messo il ret ma cosi mi stampa solo il supporto a MMX :(
; Source name :
; Executable name : CPUID.COM
; Code model: : Real mode flat model
; Version : 1.0
; Created date : 7/9/2004
; Last update : 7/9/2004
; Author : Luca Francesca
; Description : A utility to display information about CPU
; Compiling on : NASM
[BITS 16] ; 16bit output
[ORG 0100h] ; for .com
[SECTION .text]
start:
mov dx, Title
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
mov dx, NewLine
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
mov dx, Name
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
mov eax, 80000002h
cpuid
mov [ProcessorStr], eax
mov [ProcessorStr+4], ebx
mov [ProcessorStr+8], ecx
mov [ProcessorStr+12], edx
mov eax, 80000003h
cpuid
mov [ProcessorStr+16], eax
mov [ProcessorStr+20], ebx
mov [ProcessorStr+24], ecx
mov [ProcessorStr+28], edx
mov eax, 80000004h ; required from Intel, optional in AMD
cpuid
mov [ProcessorStr+32], eax
mov [ProcessorStr+36], ebx
mov [ProcessorStr+40], ecx
mov [ProcessorStr+44], edx
mov byte [ProcessorStr+48], 13 ; CR
mov byte [ProcessorStr+49], 10 ; LF
mov byte [ProcessorStr+50], '$' ; String termining
mov dx, ProcessorStr
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
mov eax, 1h
cpuid
mov dx, Fam
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
;bits 11-8 (reg_eax & 0xf00) >> 8;
mov dx, NewLine
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
mov dx, Mod
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
;bits 7-4 f0 (reg_eax & 0xf0) >> 4;
mov dx, NewLine
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
mov dx, NewLine
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
mov dx, Vendor
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
mov eax, 0h
cpuid
mov [VendorStr], ebx
mov [VendorStr+4], edx
mov [VendorStr+8], ecx
mov byte [VendorStr+12], 13 ; CR
mov byte [VendorStr+13], 10 ; LF
mov byte [VendorStr+14], '$' ; String termining
mov dx, VendorStr
mov ah, 09h
int 21h
mov dx, NewLine
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
mov dx, Ext
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
; extension info
mov eax, 1h
cpuid
test edx, 00800000h ; MMX bit(23)
jnz MMX
test edx, 002000000h ; SSE bit(25)
jnz SSE
test edx, 004000000h ; SSE2 bit(26)
jnz SSE_TWO
test ecx, 000000001h ; SSE3 bit(0)
jnz SSE_THREE
test edx, 0040000000h ; 3DNow! bit(30)
jnz AMD_NOW
test edx, 0080000000; 3DNow! Extensions bit(31)
jnz AMD_NOW_EXT
; exit to the program
jmp exit
MMX:
push edx
mov dx, MMXMsg
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
pop edx
ret
SSE:
push edx
mov dx, SSEMsg
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
pop edx
ret
SSE_TWO:
push edx
mov dx, SSE_TWOMsg
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
pop edx
ret
SSE_THREE:
push edx
mov dx, SSE_THREEMsg
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
pop edx
ret
AMD_NOW:
push edx
mov dx, AMD_NOWMsg
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
pop edx
ret
AMD_NOW_EXT:
push edx
mov dx, AMD_NOW_EXTMsg
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
pop edx
ret
exit:
mov ah, 4Ch ; set int 21h service 4Ch(exit)
int 21h
[SECTION .data]
NewLine db 13, 10, '$'
Title db "§§§§§ Lucas CPUID program §§§§§", 13, 10, '$'
Name db "=> Cpu Name: ", '$'
Vendor db "=> Cpu Vendor: ", '$'
Ext db "=> Cpu supported extension:", 13, 10, '$'
Fam db "==> Cpu Family: ", '$'
Mod db "===> Cpu Model: ", '$'
; Intel specific instruction
MMXMsg db "*This CPU support the 'MMX' instructions", 13, 10, '$'
SSEMsg db "*This CPU support the 'SSE' instructions", 13, 10, '$'
SSE_TWOMsg db "*This CPU support the 'SSE2' instructions", 13, 10, '$'
SSE_THREEMsg db "*This CPU support the 'SSE3' instructions", 13, 10, '$'
; AMD specific instructions
AMD_NOWMsg db "*This CPU support the '3DNow!' instructions", 13, 10, '$'
AMD_NOW_EXTMsg db "*This CPU support the '3DNow!+ Extensions' instructions", 13, 10, '$'
[SECTION .bss]
VendorStr resb 14 ; Reserve 12 bytes for cpu's vendor string
ProcessorStr resb 50 ; Reserve 47 +3(\n) bytes for cpu's vendor string
Family resb 7 ; 4 + 3(\n)
Model resb 7 ; 4 + 3(\n)
Ho pensato fosse xche da una jmp all'altra cancellavo il valore di edx...cosi l'ho preservato...ma mi da solo il supporto alle MMX :'(
Originariamente inviato da Luc@s
[...]
Ho pensato fosse xche da una jmp all'altra cancellavo il valore di edx...cosi l'ho preservato...ma mi da solo il supporto alle MMX :'(
Uhm ma perchè mettere una ret non fai mica una call solo una jnz. :confused: Quello che intendevo io per ritornare al flusso originale del programma era una cosa simile a questa:
TEST_MMX: test edx, 00800000h ; MMX bit(23)
jnz MMX
TEST_SSE: test edx, 002000000h ; SSE bit(25)
jnz SSE
TEST_SSE2: test edx, 004000000h ; SSE2 bit(26)
jnz SSE_TWO
[...]
MMX:
mov dx, MMXMsg
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
jmp TEST_SSE
SSE:
mov dx, SSEMsg
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
jmp TEST_SSE2
[...]
ciao ;)
ma nn entra in loop infinito come dici tu?
Io non capisco il perchè di fare una JMP !?!??!
test edx, 00800000h ; MMX bit(23)
mov dx, MMXMsg
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
In effetti mi dimenticavo dell'if ;) In maniera simile a come diceva VICIUS:
TEST_MMX: test edx, 00800000h ; MMX bit(23)
jz TEST_SSE
push edx
mov dx, MMXMsg
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
pop edx
TEST_SSE: test edx, 002000000h ; SSE bit(25)
jz TEST_SSE2
push edx
mov dx, SSEMsg
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
pop edx
TEST_SSE2: test edx, 004000000h ; SSE2 bit(26)
Come vedi, mettendo in sequenza il codice ti eviti qualche salto...
Inoltre sporcavi EDX...
TEST_SSE2: test edx, 4000000h ; SSE2 bit(26)
jz TEST_SSE2
push edx
mov dx, SSE_TWOMsg
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
pop edx
TEST_AMD_NOW: test edx, 40000000h ; 3DNow! bit(30)
push edx
jz TEST_AMD_NOW
mov dx, AMD_NOWMsg
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
pop edx
TEST_AMD_NOW_PLUS: test edx, 80000000; 3DNow! Extensions bit(31)
push edx
jz TEST_AMD_NOW_PLUS
mov dx, AMD_NOW_EXTMsg
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
pop edx
Questi nn me li visualizza.....sta il loop dopo avermi mostrato il support per MMX e SSE :(
Il push va messo dopo il JZ...
Originariamente inviato da cionci
Il push va messo dopo il JZ...
anche cosi mi da solo MMX e SSE e non entrambe le 3dNow!
Incolla un po' tutto il codice...
; Source name :
; Executable name : CPUID.COM
; Code model: : Real mode flat model
; Version : 1.0
; Created date : 6/9/2004
; Last update : 7/9/2004
; Author : Luca Francesca
; Description : A utility to display information about CPU
; Compiling on : NASM
[BITS 16] ; 16bit output
[ORG 0100h] ; for .com
[SECTION .text]
start:
mov dx, Title
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
mov dx, NewLine
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
mov dx, Name
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
mov eax, 80000002h
cpuid
mov [ProcessorStr], eax
mov [ProcessorStr+4], ebx
mov [ProcessorStr+8], ecx
mov [ProcessorStr+12], edx
mov eax, 80000003h
cpuid
mov [ProcessorStr+16], eax
mov [ProcessorStr+20], ebx
mov [ProcessorStr+24], ecx
mov [ProcessorStr+28], edx
mov eax, 80000004h ; required from Intel, optional in AMD
cpuid
mov [ProcessorStr+32], eax
mov [ProcessorStr+36], ebx
mov [ProcessorStr+40], ecx
mov [ProcessorStr+44], edx
mov byte [ProcessorStr+48], 13 ; CR
mov byte [ProcessorStr+49], 10 ; LF
mov byte [ProcessorStr+50], '$' ; String termining
mov dx, ProcessorStr
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
mov eax, 1h
cpuid
mov dx, NewLine
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
mov dx, Vendor
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
mov eax, 0h
cpuid
mov [VendorStr], ebx
mov [VendorStr+4], edx
mov [VendorStr+8], ecx
mov byte [VendorStr+12], 13 ; CR
mov byte [VendorStr+13], 10 ; LF
mov byte [VendorStr+14], '$' ; String termining
mov dx, VendorStr
mov ah, 09h
int 21h
mov dx, NewLine
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
mov dx, Ext
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
; extension info
mov eax, 1h
cpuid
TEST_MMX: test edx, 800000h ; MMX bit(23)
jz TEST_MMX
push edx
mov dx, MMXMsg
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
pop edx
TEST_SSE: test edx, 2000000h ; SSE bit(25)
jz TEST_SSE
push edx
mov dx, SSEMsg
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
pop edx
TEST_SSE2: test edx, 4000000h ; SSE2 bit(26)
jz TEST_SSE2
push edx
mov dx, SSE_TWOMsg
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
pop edx
TEST_AMD_NOW: test edx, 40000000h ; 3DNow! bit(30)
jz TEST_AMD_NOW
push edx
mov dx, AMD_NOWMsg
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
pop edx
TEST_AMD_NOW_PLUS: test edx, 80000000; 3DNow! Extensions bit(31)
jz TEST_AMD_NOW_PLUS
push edx
mov dx, AMD_NOW_EXTMsg
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
pop edx
; exit to the program
mov ah, 4Ch ; set int 21h service 4Ch(exit)
int 21h
[SECTION .data]
NewLine db 13, 10, '$'
Title db "<<<< Lucas CPUID program >>>>", 13, 10, '$'
Name db "=> Cpu Name: ", '$'
Vendor db "=> Cpu Vendor: ", '$'
Ext db "=> Cpu supported extension:", 13, 10, '$'
Fam db "==> Cpu Family: ", '$' ; The CPU Family string
Mod db "===> Cpu Model: ", '$' ; The CPU Model string
; Intel specific instruction
MMXMsg db "*This CPU support the 'MMX' instructions", 13, 10, '$'
SSEMsg db "*This CPU support the 'SSE' instructions", 13, 10, '$'
SSE_TWOMsg db "*This CPU support the 'SSE2' instructions", 13, 10, '$'
; AMD specific instructions
AMD_NOWMsg db "*This CPU support the '3DNow!' instructions", 13, 10, '$'
AMD_NOW_EXTMsg db "*This CPU support the '3DNow!+ Extensions' instructions", 13, 10, '$'
[SECTION .bss]
VendorStr resb 14 ; Reserve 12 bytes for cpu's vendor string
ProcessorStr resb 50 ; Reserve 47 +3(\n) bytes for cpu's vendor string
Family resb 7 ; 4 + 3(\n)
Model resb 7 ; 4 + 3(\n)
Hai sbagliaot le etichette di salto... Dal test sulle MMX devi saltare (se non ci sono le MMX) al test sulle SSE e così via ;)
Come hai scritto te va in ciclo appena trovi una feature che non c'è sul tuo processore...
TEST_MMX lo puoi anche togliere...
cioe, giusto per capire bene:
TEST_MMX: test edx, 800000h ; MMX bit(23)
jz TEST_SSE
push edx
mov dx, MMXMsg
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
pop edx
Questo prima esegue il test MMX e stampa e poi esegue il test SSE....giusto???
Spiegami il perche cosi imparo bene ;)
Esegue il test SSE dopo perchè...o ci arriva tramite il salto (in caso in cui il bit relativo a MMX sia a 0) o ci arriva perchè il test SSE è l'istruzione successiva alla pop...
C'è un errore qui:
TEST_AMD_NOW_PLUS: test edx, 80000000; 3DNow! Extensions bit(31)
jz FINE_TEST
push edx
mov dx, AMD_NOW_EXTMsg
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
pop edx
; exit to the program
mov ah, 4Ch ; set int 21h service 4Ch(exit)
int 21h
FINE_TEST:
Altrimenti ti stampa sempre 3dNow!+...
Ed un errore qui:
TEST_SSE2: test edx, 4000000h ; SSE2 bit(26)
jz TEST_AMD_NOW
push edx
In questo modo se ti trova le SSE2 il test per le SSE3 non te lo fa...
Si dice Fixed, non Corrected ;)
Manca un h qua in fondo: test edx, 80000000 (sulle 3dNow!+)
Originariamente inviato da cionci
Manca un h qua in fondo: test edx, 80000000 (sulle 3dNow!+)
mi da sempre la stessa cosa :muro:
Non le devi cercare lì le 3dnow!... Devi richiamare CPUID con un altro valore in eax: http://www.paradicesoftware.com/specs/cpuid/index.htm
mov eax, 80000008h ; extended function for AMD
cpuid
TEST_AMD_NOW: bt edx, 30 ; 3DNow! bit(30)
jc TEST_AMD_NOW_PLUS
push edx
mov dx, AMD_NOWMsg
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
pop edx
TEST_AMD_NOW_PLUS: bt edx, 31; 3DNow! Extensions bit(31)
jc FINE_TEST
push edx
mov dx, AMD_NOW_EXTMsg
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
pop edx
FINE_TEST:
; exit to the program
mov ah, 4Ch ; set int 21h service 4Ch(exit)
int 21h
Indi cosi :D
No....
Note: to identify support for the extended values, you must first call eax=$8000_0000, which returns the maximum supported extended levels in eax.
mov eax, 80000000h
cpuid
cmp eax, 80000008h
JG FINE_TEST
mov eax, 80000001h ; extended function for AMD
cpuid
TEST_AMD_NOW: bt edx, 30 ; 3DNow! bit(30)
jc TEST_AMD_NOW_PLUS
push edx
mov dx, AMD_NOWMsg
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
pop edx
TEST_AMD_NOW_PLUS: bt edx, 31; 3DNow! Extensions bit(31)
jc FINE_TEST
push edx
mov dx, AMD_NOW_EXTMsg
mov ah, 09h ; set int 21h service 09h(print '$'-terminated string)
int 21h
pop edx
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.