void main() { if(!CheckMMXSupport()) return;
int a = 1, b = 2; Swap(&a, &b); printf("a = %d, b = %d", a, b); }
#define cpuid __asm _emit 0x0F _emit 0xA2 __declspec(naked) BOOL CheckMMXSupport() // 加不加前面这个东西有什么区别,大家用单步调试时看一下反汇编窗口就知道了
// 因为C语言里通用寄存器(EAX、ESI之流)是可以废弃的,故可以用naked
{ __asm{ mov eax, 1; cpuid; xor eax, eax; // 将EAX清零
test edx, 0x800000; jz _NO_SUPPORT_MMX; mov eax, 1; // 32位的返回值放在EAX中,这是C语言的规定
_NO_SUPPORT_MMX: ret; } }
void Swap(int* a, int* b) { __asm{ mov edi, a; mov esi, b mov eax, [edi]; xchg eax, [esi]; mov [edi], eax; } }
|