我已经在这里问过类似的问题,但我仍然遇到一些错误,所以我希望你能告诉我我做错了什么。只知道我懂汇编,而且我在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;
}`
因此,快速总结一下,我尝试创建指向数组第一个元素的 void 指针,而不是使用间接寻址只是从寄存器中移动值。但是这种方法给了我“围绕 b 变量的堆栈损坏的运行时错误”,但我不知道为什么。
请帮忙。谢谢。这只是为了学习目的,我知道CPUID有一些功能......
编辑:另外,如何在 x86 VC++ 2010 内联汇编器中使用直接寻址?我的意思是 8051 中立即数加载的常用语法是,mov src,#number
但在 VC++ asm 中它mov dest,number
没有 # 符号。那么如何告诉编译器你想直接访问内存单元地址 x 呢?