インラインアセンブラとアセンブラの違いについて – プログラミング – Home

インラインアセンブラとアセンブラの違い...
 
通知
すべてクリア

[解決済] インラインアセンブラとアセンブラの違いについて


PG愛好者
 PG愛好者
(@PG愛好者)
ゲスト
結合: 16年前
投稿: 4
Topic starter  

【質問内容】
 インラインアセンブラ(.cpp)とアセンブラ(.asm)で同じ文法で
 記述しているが、アセンブラで記述した場合は文法エラーで
 ビルドできなないのはなぜでしょうか?

【現象コード】
 movd xmm0, [eax] ;; eaxは配列要素です.

【環境】
 OS : Windows XP SP2
 コンパイラ : Visual Studio 2008 SP1

アドバイスお願い致します。


引用未解決
トピックタグ
しま
 しま
(@しま)
ゲスト
結合: 18年前
投稿: 123
 

>コンパイラ : Visual Studio 2008 SP1
Visual Studio 2008 SP1 はコンパイラーではなくて統合開発環境(IDE)のことです
.cpp とあるので VC++ のことを指しているのだと思いますが、あってますか?

>アセンブラで記述した場合は文法エラーでビルドできなないのはなぜでしょうか?
どのアッセンブラーでアッセンブルしてエラーが出たのですか?

> インラインアセンブラ(.cpp)とアセンブラ(.asm)で同じ文法で
とありますが、
1.コンパイラーのソースに記述したのと同じものをアッセンブラーのソ-スに
記述したということですか?
そうだとして
1.1.比較対象のアッセンブラーが何か書いていないのでよくわかりませんが
1.1.1.同じ文法だということはどうやって確かめたのでしょうか?
1.1.2.どのアッセンブラーと比べて同じだとわかったのでしょうか?
1.2.インライアッセンブラーとアッセンブラーとに違いがあるからこそ
同じ記述で片方はエラーがなく、もう一方にエラーが出るのではないでしょうか


返信引用
PG愛好者
 PG愛好者
(@PG愛好者)
ゲスト
結合: 16年前
投稿: 4
Topic starter  

>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

次の質問は、以下の回答で行います


返信引用
PG愛好者
 PG愛好者
(@PG愛好者)
ゲスト
結合: 16年前
投稿: 4
Topic starter  

>とありますが、
>1.コンパイラーのソースに記述したのと同じものをアッセンブラーのソ-スに
>記述したということですか?
>そうだとして
>1.1.比較対象のアッセンブラーが何か書いていないのでよくわかりませんが
>1.1.1.同じ文法だということはどうやって確かめたのでしょうか?
>1.1.2.どのアッセンブラーと比べて同じだとわかったのでしょうか?
>1.2.インライアッセンブラーとアッセンブラーとに違いがあるからこそ
>同じ記述で片方はエラーがなく、もう一方にエラーが出るのではないでしょうか

違いは、C++ポインタ変数であるのかとeaxレジスタであるかの違いだけですね。
eaxレジスタ(r32)からxmmレジスタ(r128)へ転送できない理由がわからないです。
intelのアセンブラ命令の解説を見る限り文法上に問題ないように見えます

ソースは前述の通り、一部を抜粋して書いています


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

エラーメッセージを省略したり勝手に翻訳したりせずそのまま書くべきだ。
何エラーが出てる川から無いのにどうアドバイスしろ、というのだ?

俺が試した範囲ではエラー出ないよ。正しくコード書けていないだけだろう。
擬似命令はどうなっている?


返信引用
PG愛好者
 PG愛好者
(@PG愛好者)
ゲスト
結合: 16年前
投稿: 4
Topic starter  

自己解決しました。

*.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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました