Я уже задавал подобный вопрос здесь, но я все еще получаю некоторые ошибки, поэтому я надеюсь, что вы могли бы сказать мне, что я делаю неправильно. Просто знайте, что я знаю ассемблер, и я сделал несколько проектов на ассемблере 8051, и даже он не тот, что близок к x86 ассемблеру.
Есть блок кода, который я пробовал в VC++ 2010 Express (я пытаюсь получить информацию из инструкции CPUID): `
int main()
{
char a[17]; //containing array for the CPUID string
a[16] = '\0'; //null termination for the std::cout
void *b=&a[0];
int c=0; //predefined value which need to be loaded into eax before cpuid
_asm
{
mov eax,c;
cpuid;
mov [b],eax;
mov [b+4],ebx;
mov [b+8],ecx;
mov [b+12],edx;
}
std::cout<<a;
}`
Итак, чтобы подвести итог, я попытался создать пустой указатель на первый элемент массива, а затем, используя косвенную адресацию, просто переместить значения из регистров. Но этот подход дает мне «стек вокруг переменной b поврежден во время выполнения», но я не знаю, почему.
Пожалуйста помоги. Спасибо. И это только в учебных целях, я знаю, что есть функции для CPUID....
РЕДАКТИРОВАТЬ: Кроме того, как вы можете использовать прямую адресацию в встроенном ассемблере x86 VC++ 2010? Я имею в виду, что общий синтаксис для непосредственной загрузки номера в 8051 - это mov src,#number
, но в VC++ asm это mov dest,number
без знака #. Итак, как сообщить компилятору, что вы хотите получить прямой доступ к ячейке памяти с адресом x?