2009-11-12 34 views
0

只是粘貼一個示例,而不是我的整個代碼,這有點大。當我將代碼移植到VC++而不是使用GCC時,我需要重寫幾個內聯彙編函數,它們接收指針並在這些指針上保存值。將內聯asm寄存器的值保存到C指針,爲了簡單起見,可以在GCC上獲取它,但不是VC

想象CPUID例如:

void cpuid(int* peax, int* pebx, int* pecx, int* pedx, int what){ 
    __asm__ __volatile__("cpuid" : "=a" (*peax), "=b" (*pebx), "=c" (*pecx), "=d" (*pedx) : "a" (what)); 
} 

,這將只是工作,它將被CPUID「返回」保存值的寄存器上,我傳遞給函數指針。

可以使用VC的內聯彙編程序完成相同的操作嗎? 到目前爲止完全相同的函數簽名但:

mov eax, what; 
cpuid; 
mov dword ptr [peax], eax; 
etc 

不會工作,PEAX將它調用函數之前有同樣的價值。

在此先感謝。

回答

1

很難看到,因爲它只是一個片段,再加上它可以從C++代碼/ thiscall調用。

在某些情況下,它可能必須是「裸體」(__declspec(裸體))。

由於VC正在降級x64內聯asm支持iirc,因此它不會端口。

使用__cpuid或__cpuidex內在並享受。

0
mov eax, what; 
cpuid; 
mov ecx, dword ptr peax; 
mov [ecx], eax; 

將工作。

祝你好運!

相關問題