• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語->アセンブリ->C言語で構造体渡し)

C言語構造体渡しにおけるアセンブリでのデータ代入方法

このQ&Aのポイント
  • C言語からアセンブリを介してデータを渡す場合、どのような方法でアプリ側のデータをOS側の構造体に代入することができるのかを解説します。
  • 質問者はOS開発を行っており、C言語の構造体をアセンブリ経由でOS側に渡す方法を知りたいとしています。
  • 具体的なプログラム例を挙げながら、アプリ側のデータをOS側の構造体に代入するために必要な手順について説明します。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

答えから言うと2です。 先ず、アセンブラが呼び出された直後は スタックの先頭に帰り先アドレスがあります。 ここはESP+0の地点です。この後ろにdataが あるので、dataはESP+4になります。 アセンブラの中でEBXを退避するためPUSHを 行ったので、ESPは-4され、それからEBXに 代入されます。つまり、EBXから見ると、 EBXの元の値、帰り先、dataの順に並んで います。32bitマシンでは各項目は4バイトなので、 +0:EBXの元の値 +4:帰り先 +8:dataの先頭 という具合です。 但し、C言語ではポインタにおける"+1"は型の サイズ分を指します。intは4バイトなので、 8バイト先は+2になります。 以下のように分解してみると分かり易いでしょう。 test data; test *ptr; int *mid; mid = (int *)ebx; //★1 ptr = (test *)(mid + 2); //★2 data = *ptr; //★3 ★1 int型ポインタにebxを代入する。 ★2 data型ポインタにintの2個先のアドレスを設定する。   先に述べたようにintとしては"2個"先にdataがある。 ★3 内部のデータにポインタから内容をコピーする。

noname#200952
質問者

お礼

15分で解決しました。 原因はデータセグメントの問題でした。 ありがとうございました。

noname#200952
質問者

補足

回答ありがとうございます。 PUSHで、ESPがマイナスされるのをすっかり忘れてました。 さっそく試したのですが、うまくいきません…。 そこで、ポインタを渡すことにして、 PUSHしなくていいように、ECXを使い、 MOV ECX,[ESP+4];(ポインタは、四バイトなので) で、 test *data data=(test *)ecx; でやってみたら、 アドレスの受け渡しはうまくいきましたが、 data->t1; で参照すると、0がでます。 一週間この問題で悩み、頭がごちゃごちゃです。 もう少しだけ、回答お願いします。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「? に数字を入れる」だけではだめなはずだけど.... さておき, どのような ABI に従っているのかをまず明確にしてください.

関連するQ&A

専門家に質問してみよう