【質問内容】
インラインアセンブラ(.cpp)とアセンブラ(.asm)で同じ文法で
記述しているが、アセンブラで記述した場合は文法エラーで
ビルドできなないのはなぜでしょうか?
【現象コード】
movd xmm0, [eax] ;; eaxは配列要素です.
【環境】
OS : Windows XP SP2
コンパイラ : Visual Studio 2008 SP1
アドバイスお願い致します。
>コンパイラ : Visual Studio 2008 SP1
Visual Studio 2008 SP1 はコンパイラーではなくて統合開発環境(IDE)のことです
.cpp とあるので VC++ のことを指しているのだと思いますが、あってますか?
>アセンブラで記述した場合は文法エラーでビルドできなないのはなぜでしょうか?
どのアッセンブラーでアッセンブルしてエラーが出たのですか?
> インラインアセンブラ(.cpp)とアセンブラ(.asm)で同じ文法で
とありますが、
1.コンパイラーのソースに記述したのと同じものをアッセンブラーのソ-スに
記述したということですか?
そうだとして
1.1.比較対象のアッセンブラーが何か書いていないのでよくわかりませんが
1.1.1.同じ文法だということはどうやって確かめたのでしょうか?
1.1.2.どのアッセンブラーと比べて同じだとわかったのでしょうか?
1.2.インライアッセンブラーとアッセンブラーとに違いがあるからこそ
同じ記述で片方はエラーがなく、もう一方にエラーが出るのではないでしょうか
>Visual Studio 2008 SP1 はコンパイラーではなくて統合開発環境(IDE)のことです
>.cpp とあるので VC++ のことを指しているのだと思いますが、あってますか?
はい
VC++(+VC付属のMASM)です
>どのアッセンブラーでアッセンブルしてエラーが出たのですか?
インラインアセンブラでは、以下がOKです
_asm {
~中略~
movd xmm0, [ptr] // ptrはポインタ変数です.
~中略~
}
アセンブラでは、以下がNGです
PUBLIC C _function@24
.code
_function@24 PROC
~中略~
movd xmm0, [eax] // eaxはポインタ変数です.
~中略~
_function@24 ENDP
end
次の質問は、以下の回答で行います
>とありますが、
>1.コンパイラーのソースに記述したのと同じものをアッセンブラーのソ-スに
>記述したということですか?
>そうだとして
>1.1.比較対象のアッセンブラーが何か書いていないのでよくわかりませんが
>1.1.1.同じ文法だということはどうやって確かめたのでしょうか?
>1.1.2.どのアッセンブラーと比べて同じだとわかったのでしょうか?
>1.2.インライアッセンブラーとアッセンブラーとに違いがあるからこそ
>同じ記述で片方はエラーがなく、もう一方にエラーが出るのではないでしょうか
違いは、C++ポインタ変数であるのかとeaxレジスタであるかの違いだけですね。
eaxレジスタ(r32)からxmmレジスタ(r128)へ転送できない理由がわからないです。
intelのアセンブラ命令の解説を見る限り文法上に問題ないように見えます
ソースは前述の通り、一部を抜粋して書いています
エラーメッセージを省略したり勝手に翻訳したりせずそのまま書くべきだ。
何エラーが出てる川から無いのにどうアドバイスしろ、というのだ?
俺が試した範囲ではエラー出ないよ。正しくコード書けていないだけだろう。
擬似命令はどうなっている?
自己解決しました。
*.asmで記述する場合は、下記の通りにする必要があります。
1.XMMレジスタで行う場合.
movd xmm0, dword ptr [eax] ;; OK
movd xmm0, [eax] ;; NG
2.MMレジスタで行う場合.
movd mm0, dword ptr [eax] ;; OK
movd mm0, [eax] ;; NG
下記URLでMASMのバグとして(?)指摘されています。
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?
FeedbackID=166511