Pana la urma am facut sa arate si Feature-urile si versiunea procesorului, nu mai modific in primul post, postez aici totul:
section '.code' code readable writeable executable
tit db 'by Shocker',0
vendor db 'Vendor: ............',13,'Version: ',13,13,'Features: ',0
featString db 'FPU VME DE PSE TSC MSR PAE MCE CX8 APIC RESV SEP MTRR PGE MCA CMOV PAT PSE3 PSN CLFS RESV DS ACPI MMX FXSR SSE SSE2 SS HTT TM RESV PBE ',0
features dd 0
curfeat dd 4
curpos db 0
i dd 4
start:
mov eax,0 ;vendor-ul procesorului
CPUID
mov eax,vendor ;stocheaza in eax offsetul string-ului VENDOR
add eax,8 ;porneste scrierea de la pozitia 8 in string [dupa "Vendor:"]
;VENDOR-ul va fi returnat in cei 3 registrii EBX,EDX si ECX
mov dword [ds:eax],ebx ;primii 4 bytes din vendor - "Auth"
mov dword [ds:eax+4],edx ;urmatorii 4 bytes - "enti"
mov dword [ds:eax+8],ecx ;ultimii 4 bytes - "cAMD"
mov eax,1 ;features and version
CPUID
mov [features],edx
mov ebx,vendor
add ebx,30 ;pozitia de unde sa inceapa scrierea versiunii in string
;conversia versiunii din integer in string
mov esi,1000
@loopConversion:
mov edx,0
mov ecx,esi
div ecx
add eax,48
mov byte [ds:ebx],al
push edx
inc ebx
mov eax,esi
mov edx,0
mov ecx,10
div ecx
mov esi,eax
pop eax
cmp esi,1
jne @loopConversion
add eax,48
mov byte [ds:ebx],al
;verificarea feature-urilor. Totul se face la nivelul bitilor din variabila dword "features"
mov [curfeat],1
mov [i],-1
@loop:
mov eax,[i]
inc eax
cmp eax,32 ;s-au verificat toate feature-urile?
je @done ;da? sari la @done
mov [i],eax
mov ebx,[curfeat] ;feature-ul curent
and ebx,[features] ;verifica daca e feature-ul. Daca da, EBX va fi nenul
mov eax,[curfeat]
shl eax,1 ;left shift sa trecem la urmatorul feature
mov [curfeat],eax
cmp ebx,0 ;e EBX nul?
je @loop ;inseamna ca feature-ul nu exista, mergi la urmatorul feature
mov eax,[i]
mov edx,0
mov ecx,5
mul ecx ;feature-ul curent * 5, ca sa se ajunga la pozitia lui in string-ul cu feature-uri [care sunt din 5 in 5 bytes fiecare]
mov ebx, dword[ds:featString+eax] ;baga in EBX
movzx edx, [curpos];de unde sa inceapa sa scrie in stringul de iesire
add edx,46 ;de la curpos + 32 [32 e lungimea stringului pana la si inclusiv "Features: "
mov dword [ds:vendor+edx],ebx
add [curpos], 5 ;variabila care tine ultima pozitia din string-ul de iesire
jmp @loop
@done:
movzx edx, [curpos];ultima pozitie din string-ul de iesire
add edx,46 ;adauga 46, lungimea string-ului pana la "...blabla...Features: "
mov dword [ds:vendor+edx],0 ;adauga caracterul 0 sa arate sfarsitul stringului
push 0
push tit
push vendor
push 0
call [MessageBox]
push 0
call [ExitProcess]
.end start
Download .EXE