• 締切済み

メモリーや配列変数域にプログラム書きアクセスする

Visual Studio6(32Bit)ではメモリーや配列変数域にアセンブラーでプログラムコードを直接書き込んでアセンブラーのCALL命令でそのエリアをCPUがアクセス出来たのですが。 Visual Studio8(64Bit)ではエラーになりました。 8でもアクセス可能にする方法を教えてください。

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.5

速度だけの問題だったら 最近の賢いコンパイラだと、人間が下手に考えるより、よっぽど効率のいいコード出力しますからね。 それでもアセンブリを使いたいなら、Windowsのような高レベルのOSでやるなら、インラインアセンブラを使ったり、別途アセンブリのソースを用意してアセンブル→リンクする、とかが本来の手段でしょう。 あと、express版は上位版に比べて機能が制限されていたと記憶しています。

7777777v
質問者

補足

回答ありがとうございます。 実際には画面上の点(ドット)を読み書きする16バイト程度のアセンブラコードを、メモリー上に最大ループ回数分のコードを展開して直線的に処理して、ループ判断処理と分岐時間を回避して高速処理することが目的です。 >あと、express版は上位版に比べて機能が制限されていたと記憶しています。 この点ですが、VS6の環境で出来たプロジェクトワークスペースをVS8に移行する際変換してビルドした場合は、この展開コードも問題なく動作してくれますが、VS8で新規プロジェクトを立ち上げソース等を6から持ってきた場合は不可のようです。 機能制限はこの分野では大丈夫のようです。 コンパイラオプションの設定方法を教えてください。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

インラインアセンブラは検討の対象外?

全文を見る
すると、全ての回答が全文表示されます。
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.3

既に書かれているとおり、DEP(データ実行防止)のお陰でしょう。 32ビット版Windowsと64ビット版Windowsでは保護される範囲が異なるのが原因だろうと思います。 解決策は、実行が許可されているメモリー領域を確保してそこに書き込むことです。

7777777v
質問者

補足

32ビット環境でビルドした実行ファイルでも64ビット環境で動作しています。 64ビット環境でビルドする時点で完全に32ビット環境を再現できる、コンパイラオプションの設定方法を教えてください。 visual studio8 expressバージョンには6のようにGIUで画面設定出来ないようです。

全文を見る
すると、全ての回答が全文表示されます。
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

「データ実行防止」ですか? 配列変数はデータセグメントに置かれますので、CPUによってはそこにマシン語を書き込んでも動作しない(例外発行されて止められる)場合があるかと思われますが… また、32Bitモードと64BitモードではCPUの動作モードが異なったりしませんか? # 動作モードがことなる為にアドレスにマップされている状態が変わっているとか?

7777777v
質問者

補足

メモリーに書き込んだコードを読み出して確認しましたが、コードも書き込みバイト数も正しく書き込まれていました。 vs6(32bit)環境でビルドした、実行ファイルは64bitマシンで動作確認できています。 vs8(64bit)環境でビルドした場合に実行エラーがでます。 コンパイラオプションが怪しいと考えますがvisual studio8 expressバージョンではオプション設定画面がありません。vs8でのコンパイラオプションの設定方法を教えてください。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

なぜそのようなことをしなければならないのですか?

7777777v
質問者

補足

高速処理のためです。 数行の同じコードを数百記述するため、メモリーエリアに実行プログラムを書き込んでいます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Windows7(64bit)でのプログラム実行

    Visual Studio 2010で作成したプログラム(32bit版)はWindows7(64bit)のOSで 自動識別してくれて問題なく動作するでしょうか。 それとも実行に先立ち、何か予め設定がいるでしょうか。

  • 配列変数のポインターが勝手に変わる

    下記の2個のファイルを持つプログラムでインラインアセンブラのcall命令で配列変数のポインター(アドレス)が勝手に変わる現象をおしえてください。 但し、配列の最初のポインターのみが変わる。 開発環境はWin7(64bit)、VC++2010無償版です。 main.cpp int *disp; int data[3]; WinMain() { _asm mov disp,offset disp_top ・ ・ ・ メッセージループへ _asm{ disp_top://下記move()からcallされた時 lea eax,data//下記のmove()関数のeaxの値より16番地少ない lea ebx,data+4//下記のmove()関数のebxの値と同じ lea ecx,data+8//下記のmove()関数のecxの値と同じ ・ ・ ・ ret   } } move.cpp extern int *disp; extern int data[3]; void move() { _asm{ lea eax,data lea ebx,data+4 lea ecx,data+8 call disp   } }

  • 変数について

    お世話になります。 VBAにてプログラムを作成しています。 本コードで得た変数をCALLのサブルーチン先 でもその変数を生かしたいのですが、empty空 になってしまいます。 変数宣言はPublicにしているのですが。 そう言うものなのでしょうか。 お教え頂きたく宜しくお願い申し上げます。

  • 本当にPublicな変数(配列で)

    複数のフォームがあるVisualBasicのプログラムを作っているのですが、そのすべてのフォームからアクセス(値の変更も含める)できる配列の変数というのはないのでしょうか?  Public 文を使ってみると、「定数、固定長文字列、配列、ユーザー定義型文字列、およびDeclareステートメントは、オブジェクトモジュールのパブリックメンバとしては使用できません。」 というエラーメッセージがでます。 解決法を教えてください。

  • Visual StudioC#で、変数を見る機能

    Visual StudioC#には、作ったプログラムを実行しているときに変数がどんな値になっているのかを見る機能って無いのでしょうか? Microsoft Visual Studio 2010 Expressを使っています。 例えば、 ボタン1を押す→A=1代入 ボタン2を押す→B=2代入 ボタン3を押す→C=3代入 上のだと、今までだとテキストボックス3つに各変数の値を表示していました。でもいちいち全てをそんなデバッグするの面倒です・・・実行中に直接、Visual Studio上で変数の値を見ることってできないのでしょうか? よろしくお願いします。

  • MSVCR110.dllがないため、プログラムが開

    MSVCR110.dllがないため、プログラムが開始できませんと出てきます 自宅サーバーでPHPをインストールしたく試みているのですが 上手くいきません 調べたら、Visual Studio 2012 更新プログラム 4 の Visual C++ 再頒布可能パッケージ というものをインストールすれば解決するとあるのですが 64bit版、32bit版どちらを入れても解決しませんでした どうすれば、解決できますでしょうか? 使用OSはWindows7 64bit版です

  • char* 宣言での配列要素アクセスについて

    char* 宣言での配列要素アクセスについて char*型で宣言したポインタ変数に対して 配列の要素でアクセスすると落ちてしまいます。 理由がよくわかりません。 以下コードになります。 (コードA) char* pA = "123456789"; pA[2] = 'A'; 以下のコードの場合は問題ありません。 (コードB) char pB[] = "123456789"; pB[2] = 'B'; 両者の違いがいまいちよく分かりません。 コードAでpA[2]のアドレスを確認すると、 pAのアドレス[+2]を指しているので問題ないともうのですが、 間違っているのでしょうか? pAに対して特別な操作はしていません。 ご教授お願いいたします。

  • 配列の渡し方

    お世話になります。 DBからの検索結果を指定した件数で表示するプログラムを作っています。最初のページはうまく表示できるようになったのですが、次のページを表示する際に検索条件が引き継がれずうまく表示できません。検索条件は配列で持っているのですが、配列の中身ごと次のページに引き渡すにはどうしたら良いのでしょうか? ちなみに現在は下記のようなコードで実行しています。 echo " <a href=\"".$_SERVER["PHP_SELF"]."?p=$next&gender=$genderUrl&area=$areaUrl\"> 次のページ</a>"; 上記のコードで言うと、&areaが配列になります。 &genderは単なる数値なのでうまく引き継がれるのですが、&areaはArray()となるだけでうまく引き継がれません。なお、配列の中身は2バイト文字です。 お手数をお掛けしますがよろしくお願いします。

    • 締切済み
    • PHP
  • c++のグローバル変数

    お世話になります c++のグローバル変数の使い方を教えていただけないでしょうか Visual Studio 2008を使用しております ------------abc.cpp------------- int AAA; BBB(){ AAA = 1; } abc::CCC(){ AAA = 2; } コンパイル(ビルド)ではエラーは出ないのですが、 BBBをコールした時は変数AAAに値をセットできるのですが、 abc::CCCをコールした時、AAAに値がセットできません、 ウォッチ等も「エラー:識別子'AAA'はスコープ外です」 となってしまいます。 補足 BBBはリンクしているライブラリ(修正不可)からコールされる為、 クラスに組み込む事が出来ません。

  • 取り扱える最大配列数を大きくする方法を教えてください

    取り扱える最大配列数を大きくする方法を教えてください 熱伝導方程式を数値計算で解いてしています。 (他にも偏微分方程式をいくつか同時に解く必要があります) 温度場(2次元)として配列 double T[m][m],dT[m][m]を用意してプログラムを作成して解いています。 m=400まではプログラムが正常に動くのですが、m=500になると、いきなり終了します。 使用OSはWindows7-64bit、コンパイラはvisual c++ 2008 express editionです。 CPUはIntel-i7 860(2.8G)、RAMは8GBです。 同様のプログラムをスパコンで実行すると、m値によってプログラムが終了する問題は起きません。 また、プログラムを若干変更し、使用する配列数を減らすと使用できる最大mの数が増えるので、 何かWiondowsかコンパイラーか、1つのプログラムが使用できるメモリーの制限等に引っかかっていると思うのですが、どう対策を施して良いのかわかりません。 解決方法をご存知の方どうぞよろしくお願いします。