こちらでも同様の質問をしましたが、まだエラーが発生するので、何が間違っているのか教えていただければ幸いです。私はアセンブラーを知っており、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 に直接アクセスすることをコンパイラに伝えるにはどうすればよいでしょうか。