私はしばらくの間アセンブリを勉強しており、コツをつかみ始めていますが、理解できないように見えることの 1 つは、ローカルのローミングを終了するためにスタック ポインターをデクリメントする必要がある理由です。変数については、次のコードを見てください: (64 ビット GNU コンパイラ、AT&T 構文でコンパイルされたコード)
pushq %rbp
movq %rsp, %rbp
subq $48, %rsp
call __main
movl $0, -4(%rbp)
movl $4, -8(%rbp)
movl -8(%rbp), %edx
movl -4(%rbp), %eax
addl %edx, %eax
movl %eax, -12(%rbp)
movl -4(%rbp), %edx
movl -12(%rbp), %eax
addl %eax, %edx
movl -8(%rbp), %eax
addl %edx, %eax
movl %eax, -16(%rbp)
addq $48, %rsp
popq %rbp
ret
この小さなプログラムでは、esp を 48 ずつデクリメントする必要なく、これらすべてを実行できると想像できます。ベース ポインターを使用してスタックから値を移動したり、スタックに値を移動したり、esp を同じ位置にポイントさせて ebp をポップする準備ができているだけです。そして戻る。誰かがローカル変数のために「余地」を残す必要がある理由を明確にすることができますか? ありがとう!!これがばかげた質問のように思われる場合は、お詫び申し上げます