0

64 ビット プラットフォームでサポートされていないアセンブリ コードを含む C++ プロジェクトの 32 ビットから 64 ビットへの移行に取り組んでいます。移行する必要があるプロジェクトに関する基本的な情報を提供したいと思います。

  • プロジェクトの出力は、別の C++ プロジェクトで使用される lib ファイルです

  • アセンブリ コードを含むコンテキストは次のとおりです。

    int* a = Begin_args;
    int* b = End_args; (where Begin_args and End_args are int*)
    while (b > a)
    {
       int test = *(--b);
       __asm push test
    }
    
  • したがって、基本的にはステートメントを置き換える必要があります__asm push test

私が直面している問題は次のとおりです。

  • 同じ push ステートメントの pop ステートメントを見つけることができません

  • プロジェクトの出力が lib ファイルであるため、プロジェクトをデバッグできません。

  • スタック、配列、キューを使用してみましたが、うまくいきませんでした。コンパイル エラーは発生しませんが、アプリケーションを起動するとクラッシュします。

だから私の質問は:

  • 出力が lib ファイルである C++ プロジェクトをデバッグできますか?

  • 他のフォーラムでもこの質問をしました。誰かが試してみるように言いましたが、代わりにva_listどのように機能するか理解できません。va_list__asm push test

  • 最後に、この Asm コードを C++ に置き換える方法/この Asm コードを置き換えるにはどうすればよいですか?

私は長い間この問題に悩まされているので、どんな助けも大歓迎です.

4

1 に答える 1

0

呼び出し規約に依存するため、同等のステートメントがない場合があることに注意してください。pop

たとえば、x86 の呼び出し規則の 1 つがsp、関数中に移動するスタック ポインターでbpあり、前sp(次に高いスタック フレームから) である場合。

つまり、関数のエピローグ コードは次のようになります。

mov  sp, bp  ; just set sp to previous sp
pop  bp      ; pop previous sp
ret          ; and return

関数内で何をしたかはほとんど問題になりませんsp。例えば:

func:              ; here, the stack has return address
      push bp      ; push current bp
      mov bp, sp   ; put sp into bp

      sub  sp, 50  ; do whatever you want with sp here

      mov  sp, bp  ; just set sp to previous sp
      pop  bp      ; pop previous sp
      ret          ; and return

上記のsubコードの命令は、関数のローカル変数にスペースを割り当てるためによく使用されます。関数へのパラメータは呼び出しの前にプッシュされたので、 でアクセスでき[bp+N]、ローカル変数には でアクセスできます[bp-N]

于 2013-10-16T06:05:53.253 に答える