- 締切済み
メモリーや配列変数域にプログラム書きアクセスする
Visual Studio6(32Bit)ではメモリーや配列変数域にアセンブラーでプログラムコードを直接書き込んでアセンブラーのCALL命令でそのエリアをCPUがアクセス出来たのですが。 Visual Studio8(64Bit)ではエラーになりました。 8でもアクセス可能にする方法を教えてください。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- kmee
- ベストアンサー率55% (1857/3366)
速度だけの問題だったら 最近の賢いコンパイラだと、人間が下手に考えるより、よっぽど効率のいいコード出力しますからね。 それでもアセンブリを使いたいなら、Windowsのような高レベルのOSでやるなら、インラインアセンブラを使ったり、別途アセンブリのソースを用意してアセンブル→リンクする、とかが本来の手段でしょう。 あと、express版は上位版に比べて機能が制限されていたと記憶しています。
- Tacosan
- ベストアンサー率23% (3656/15482)
インラインアセンブラは検討の対象外?
- salsberry
- ベストアンサー率69% (495/711)
既に書かれているとおり、DEP(データ実行防止)のお陰でしょう。 32ビット版Windowsと64ビット版Windowsでは保護される範囲が異なるのが原因だろうと思います。 解決策は、実行が許可されているメモリー領域を確保してそこに書き込むことです。
補足
32ビット環境でビルドした実行ファイルでも64ビット環境で動作しています。 64ビット環境でビルドする時点で完全に32ビット環境を再現できる、コンパイラオプションの設定方法を教えてください。 visual studio8 expressバージョンには6のようにGIUで画面設定出来ないようです。
- Wr5
- ベストアンサー率53% (2173/4061)
「データ実行防止」ですか? 配列変数はデータセグメントに置かれますので、CPUによってはそこにマシン語を書き込んでも動作しない(例外発行されて止められる)場合があるかと思われますが… また、32Bitモードと64BitモードではCPUの動作モードが異なったりしませんか? # 動作モードがことなる為にアドレスにマップされている状態が変わっているとか?
補足
メモリーに書き込んだコードを読み出して確認しましたが、コードも書き込みバイト数も正しく書き込まれていました。 vs6(32bit)環境でビルドした、実行ファイルは64bitマシンで動作確認できています。 vs8(64bit)環境でビルドした場合に実行エラーがでます。 コンパイラオプションが怪しいと考えますがvisual studio8 expressバージョンではオプション設定画面がありません。vs8でのコンパイラオプションの設定方法を教えてください。
- Tacosan
- ベストアンサー率23% (3656/15482)
なぜそのようなことをしなければならないのですか?
補足
高速処理のためです。 数行の同じコードを数百記述するため、メモリーエリアに実行プログラムを書き込んでいます。
補足
回答ありがとうございます。 実際には画面上の点(ドット)を読み書きする16バイト程度のアセンブラコードを、メモリー上に最大ループ回数分のコードを展開して直線的に処理して、ループ判断処理と分岐時間を回避して高速処理することが目的です。 >あと、express版は上位版に比べて機能が制限されていたと記憶しています。 この点ですが、VS6の環境で出来たプロジェクトワークスペースをVS8に移行する際変換してビルドした場合は、この展開コードも問題なく動作してくれますが、VS8で新規プロジェクトを立ち上げソース等を6から持ってきた場合は不可のようです。 機能制限はこの分野では大丈夫のようです。 コンパイラオプションの設定方法を教えてください。