したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | メール | |

管理人の独り言(プログラミング関連)

1849 ◆adhRKFl5jU:2009/04/29(水) 13:07:23
#include <cstdio>
#include <windows.h>

extern "C"{
int test();
int IsCanUseCpuid();

struct CpuidData{
unsigned int eax, ecx, edx, ebx, esp, ebp, esi, edi;
};
void Cpuid(unsigned int, CpuidData*);
}

using namespace std;

int main(int argc, char **argv){
printf("%d\n", test());
printf("%d\n", IsCanUseCpuid());
CpuidData cd;
Cpuid(0, &cd);
char str[13];
*((unsigned int*)&str[0]) = cd.ebx;
*((unsigned int*)&str[4]) = cd.edx;
*((unsigned int*)&str[8]) = cd.ecx;
str[12] = '\0';
printf("%s\n", str);
MessageBox(NULL, TEXT("TEST"), NULL, MB_OK);
}
-----
global _test
global _IsCanUseCpuid
global _Cpuid

section .text

;引数
;1:eaxに入れる値
;2:レジスタの結果を入れる32bytes分のバッファへのポインタ
;void __cdecl Cpuid(unsigned int, unsigned char (*)[32]);
align 16
_Cpuid:
mov eax, [esp + 4]
cpuid
mov [esp + 4], eax
mov eax, [esp + 8]
mov [eax + 4], ecx
mov [eax + 8], edx
mov [eax + 12], ebx
mov [eax + 16], esp
mov [eax + 20], ebp
mov [eax + 24], esi
mov [eax + 28], edi
mov ecx, eax
mov eax, [esp + 4]
mov [ecx], eax
ret

;int __cdecl IsCanUseCpuid();
align 16
_IsCanUseCpuid:
push ebx
pushfd
mov eax, 1 << 21
pop ebx
mov ecx, ebx
mov edx, ebx
xor ebx, eax
and edx, eax
push ebx
popfd
pushfd
pop ebx
and ebx, eax
xor eax, eax
cmp ebx, edx
setne al
push ecx
popfd
pop ebx
ret


align 16
_test:
push ebp
mov ebp, esp
and esp, 0xFFFFFFF0
sub esp, 0x40

xorpd xmm0, xmm0
xorpd xmm1, xmm1
xorpd xmm2, xmm2
xorpd xmm3, xmm3
xorpd xmm4, xmm4
xorpd xmm5, xmm5
xorpd xmm6, xmm6
xorpd xmm7, xmm7

xor eax, eax

mov esp, ebp
pop ebp
ret


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板