Я уже задал аналогичный вопрос здесь, но у меня все еще есть некоторые ошибки, поэтому, надеюсь, вы могли бы сказать мне, что я делаю неправильно. Просто знаю, что я знаю ассемблера, и я сделал несколько проектов на ассемблере 8051, и даже это не то же самое, близок к x86 asm.Некоторые вопросы встроенного ассемблера
Существует блок кода, который я попробовал в 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 ....
EDIT: Кроме того, как вы можете использовать прямую адресацию в встроенном ассемблере x86 VC++ 2010? Я имею в виду, что общий синтаксис для непосредственной загрузки номера в 8051 равен mov src,#number
, но в VC++ asm его mov dest,number
без знака #. Итак, как сообщить компилятору, что вы хотите получить адрес ячейки памяти x напрямую?
Вам вообще не нужно c. Просто используйте «xor eax, eax», чтобы установить eax = 0. – TonyK