2

関数の先頭で古いベースポインタをスタックに保存する意味は何ですか?アセンブリで関数を操作するのは初めてですが、これを行う意味はまだわかりません。スタックにプッシュされ、最後にポップオフされるだけで、何もしません。たとえば、次のコードはこれを行わなくても問題なく機能します。

.section .data
.section .text
.globl _start

.type add, @function
add:
    mov %rsp, %rbp
    mov 8(%rbp), %rax
    mov 16(%rbp), %rdi
    add %rax, %rdi

    mov %rbp, %rsp
    ret

_start:
    push $45
    push $36
    call add
    add  $16, %rsp

    mov $60, %rax
    syscall

この例でスタックポインタを使用するだけで、これをさらに単純化できたはずですが、それがいかに悪い習慣であるかはわかります。

4

1 に答える 1

2

xBPパラメーターまたはローカル変数を見つけるために使用するすべての関数は、最初に に設定xBPする必要がありますxSP

そうすることでxBP、呼び出し元の関数から の以前の値が破棄されるため、当然、 and などを使用して保存および復元する必要がpushありpopます。

xBPまったく使用しない場合は、保存して復元する必要はありません。

多くのコンパイラには、xSP関数パラメーターとローカル変数を見つけるために使用するオプションがあります。そのオプションが有効になっている場合は、xBP保持する必要がない場合があります (呼び出し規約で保持が必要な場合を除く)。

于 2012-10-20T13:26:06.520 に答える