сохранить значение встроенного регистра asm в указатель C, можно получить его на GCC, но не на VC - PullRequest
0 голосов
/ 12 ноября 2009

ради простоты я просто вставлю пример вместо всего моего кода, который немного огромен. при переносе моего кода в 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 ]

1 голос
/ 13 ноября 2009

Трудно увидеть, потому что это всего лишь фрагмент, плюс его можно вызвать из кода C ++ / thiscall.

В некоторых случаях он может быть «голым» (__declspec (голый)).

Он не будет портировать, поскольку VC отбрасывает встроенную поддержку asm x64 в iirc.

Используйте встроенную функцию __cpuid или __cpuidex и наслаждайтесь.

0 голосов
/ 31 декабря 2014
mov eax, what;
cpuid;
mov ecx, dword ptr peax;
mov [ecx], eax;

будет работать.

Удачи!

...