0

アセンブラでc関数を理解する方法を学ぼうとしています。「gcccode.c-m32-o code-S-fno-stack-protector」を使用して次のcプログラムをコンパイルしました

#include <stdio.h>

void function( int a, int b, int c )
{
   char buffer1[5];
   char buffer2[10];
}

void main()
{
   function( 1, 2, 3 );
}

アセンブリの出力は次のとおりです。

        .section    __TEXT,__text,regular,pure_instructions
    .globl  _function
    .align  4, 0x90
_function:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $28, %esp
    movl    16(%ebp), %eax
    movl    12(%ebp), %ecx
    movl    8(%ebp), %edx
    movl    %edx, -4(%ebp)
    movl    %ecx, -8(%ebp)
    movl    %eax, -12(%ebp)
    addl    $28, %esp
    popl    %ebp
    ret

    .globl  _main
    .align  4, 0x90
_main:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
    movl    $1, (%esp)
    movl    $2, 4(%esp)
    movl    $3, 8(%esp)
    call    _function
    addl    $24, %esp
    popl    %ebp
    ret


.subsections_via_symbols

int a、b、cを定義するオフセットが_mainと_functionで異なるため、espレジスタとebpレジスタを等しくすることはできません。ebpから4を引く行はどれですか?

ありがとう!

4

2 に答える 2

2

関数の呼び出しは通常、次のように機能します。

1)関数の外では、引数はスタックにプッシュされます

subl    $24, %esp
movl    $1, (%esp)
movl    $2, 4(%esp)
movl    $3, 8(%esp)

2)関数内では、引数とローカル変数を保持するためのスペースがスタックに割り当てられます。

subl $ 28、%esp

この場合、3つのintと15の文字、合計27バイトがあります。これは4バイト境界に揃えられます。

3)次に、引数がローカルスタックスペースにコピーされます。

movl    16(%ebp), %eax
movl    12(%ebp), %ecx
movl    8(%ebp), %edx
movl    %edx, -4(%ebp)
movl    %ecx, -8(%ebp)
movl    %eax, -12(%ebp)

ここで、16(%ebp)とその仲間は、外部にプッシュされた引数のアドレスであり、-4(%ebp)は、これらの値がコピーされる新しく割り当てられたスタックスペースのアドレスです。

于 2013-03-04T20:04:00.767 に答える
1

(32ビットアーキテクチャの場合)スタックの上位4バイトを消費するのはリターンアドレスであるため、どこでも4を引く必要はありません。

したがって、スタック上の要素を参照する場合の$4の差。リターンアドレスは命令のにプッシュされていませんcall。したがって、オフセット$ 0$4と$8はメインで問題 ありません。

movl    $1, (%esp)
movl    $2, 4(%esp)
movl    $3, 8(%esp)

実行中:

call    _function

メインでは、eip(リターンアドレス)の内容をスタックにプッシュして、espを4増やします。

関数では、リターンアドレス(4バイトを消費)がスタックの一番上にあるため、正しいオフセットは-$ 4、-$ 8、および-$ 12です。これは、関数で使用される値とまったく同じです。

movl    %edx, -4(%ebp)
movl    %ecx, -8(%ebp)
movl    %eax, -12(%ebp)
于 2013-03-04T19:55:22.023 に答える