将内联asm寄存器值保存到C指针,可以在GCC而不是VC上获取

时间:2009-11-12 20:28:28

标签: visual-studio gcc assembly x86 pointers

为了简单起见,我只是粘贴一个例子而不是我的整个代码,这有点大。当我将我的代码移植到VC ++而不是使用GCC时,我需要重写一些内联汇编函数来接收指针并在这些指针上保存值。

想象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将具有与调用函数之前相同的值。

提前感谢。

2 个答案:

答案 0 :(得分:1)

很难看,因为它只是一个片段,而且它可以从C ++代码/ thiscall调用。

在某些情况下,它可能必须是'裸体'(__ decclspec(裸))。

它不会移植,因为VC正在丢弃x64内联asm支持iirc。

使用__cpuid或__cpuidex内在函数并享受。

答案 1 :(得分:0)

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

会奏效。

祝你好运!