3

次のコード

int _main() {return 0;}

次のコマンドを使用してコンパイル:

gcc -s -nostdlib -nostartfiles 01-simple.c -o01-simple.exe

gcc バージョン 4.4.1 (TDM-1 mingw32)

OllyDbg は次の出力を生成しました。

代替テキスト

ここで何が起こっているのか説明できますか? これまでの分析:

// these two seems to be an idiom:
PUSH EBP        // places EBP on stack
MOV EBP, ESP    // overwrites EBP with ESP

MOV EAX, 0      // EAX = 0

LEAVE          // == mov esp, ebp
               //    pop ebp
               // according to 
               // http://en.wikipedia.org/wiki/X86_instruction_listings

このすべての意味は何ですか?

4

3 に答える 3

5

これにより、スタック フレームが作成されます。

PUSH EBP      
MOV EBP, ESP  

使用されている呼び出し規約では、戻り値は経由で送り返されますEAX(つまり0、あなたが書いたのでそこにありますreturn 0;-それをに変更してみて、return 1;それがコードにどのように影響するかを確認してください)。

MOV EAX, 0 

そして、これはプロセッサにスタック フレームをクリーンアップするように指示します (これは、スタック フレームの作成時に行われたことの反対である がMOV ESP, EBP続くのと同じです)。POP EBP

LEAVE
于 2010-05-25T00:19:22.280 に答える
1

int _main()この命令は、ランタイム ローダーが関数に入るときにスタック フレームをセットアップします。

プッシュ EBP
MOV EBP、ESP

スタック フレームが設定され、パラメータが指定されている場合にパラメータにアクセスするには、EBP+ パラメータのサイズ (WORD、BYTE、LONG など) からオフセットされます。

通常、このEAXレジスターは、ランタイム環境からオペレーティング システム ローダーに終了ステータスを返すための通常のレジスターです。

MOV EAX、0
離れる

つまり、プログラムが正常に終了し、オペレーティング システムに 0 が返されたと言えます。

リターンが使用される場合、オペレーティング システムに制御を戻す前に、ランタイム実行時にスタック フレームが復元されます。

POP EBP

一般的なコンセンサスは、エラーが発生した場合、値はゼロ以外であり、バッチ ファイル (古い DOS 時代を思い起こさせる) と、プログラムが正常に実行されたかどうかをチェックする UNIX スクリプトの両方から使用できるということです。バッチ ファイルまたはスクリプトの性質に応じて先に進みます。

于 2010-05-25T00:25:16.813 に答える
0

「MOV EAX,0」命令は、関数の本体です。ヘッダー コードは、コードを実行するスペースを設定するためのものです。

「LEAVE」命令は、コードを元の場所に戻します。標準ライブラリはないと言いましたが、リンカーが配置する他のコードがたくさんあります。

于 2010-05-25T00:25:10.183 に答える