質問: 下記の、M_RNDをインラインアセンブラーが参照できません。 Q1)M_RNDを参照できる様に、コードを変更出来ますか。 以上、宜しくお願いします。 double Mrand(){ static int M_RND=0x30000000; // int M_RND=0x30000000; double MAX=pow(2,31.0); *asm*("mov %eax,M_RND;" "shl $1, %eax;" "pushf;" "jnc F;" "xor %eax,0x80000009;" "F: mov M_RND,%eax;" "popf;" ); double val1; val1=M_RND; val1=val1/MAX; return val1; }
回答: こんにちは。 すいません。回答ではないです。「追記・修正依頼」欄ではせまいのでこちらから。 まず、インラインアセンブラ機能を持っているのはQtではなくコンパイラです。 Qt自体はコンパイラではありません。一種のライブラリのようなものです。(通常のライブラリより高度な実装を含むのでフレームワークと呼ばれることが多いです。) nqf27650さんが使われているコンパイラを調べて下さい。 Qt自身より使っているコンパイラの方がメジャーな可能性の方が高いと思いますので、タイトルで「Qtのインラインアセンブル...」とするよりは、例えば使っているコンパイラがgccなら「gccのインラインアセンブル...」とされた方が回答が付きやすいと思います。 因みに`int M_RND=0x30000000;`はローカル変数なのでスタック上に領域が確保されます。 私が知っているコンパイラでは、呼び出された時のスタックが特定のレジスタへ退避され、その特定のレジスタ相対でアクセスされることが多いようですが、そのオフセットがシンボル定義されるケースはあまり見かけない気がします。(知っている範囲では数値に展開されてます。) でも、実はシンボル定義することが可能なコンパイラであれば、どなたかその方法等を知っている人がいらっしゃるかも知れません。