1

私はアセンブリ言語を学んでおり、呼び出し規則とスタックのクリーンアップについて質問があります。

私は OSX を使用しているので、システム コールには次のような BSD 呼び出し規約を使用する必要があります。

SECTION .text
    push StringLen ; Push string length 
    push MyString  ; Push the string
    push 0x1       ; Push the file descriptor (stdout)
    mov eax, 4     ; Push the system call (sys_write)
    int 0x80       ; Call kernel dispatcher
    add esp, 0x10  ; Clean up stack 16 bytes for 4DWORDS

    mov eax, 1
    mov ebx, 0
    int 0x80       ; System exit

私の質問はadd esp, 0x10、スタックをクリーンアップするための良い習慣と考えられていますか? 私は実験しましたが、クリーンアップ後、値はまだスタックにあるように見えますが、別の値がプッシュされると上書きされます。

    add esp, 0x10  ; Clean up stack 16 bytes for 4DWORDS
    push 0x1A      ; New push overwrites the previous stack values

これは小さなプログラムでは大きな違いをもたらさないと確信していますが、大きなプログラムでは、上書きされなければスペースが無駄になることはありませんか?

4

2 に答える 2

1

しかし、大きなものでは、上書きされない限り、無駄なスペースではありませんか?

いいえ、無駄なスペースではありません。スタックスペースの16バイトは、何度も再利用されます。

于 2013-03-14T15:16:59.067 に答える
1

はい、パラメータを渡してクリーンアップするこの方法は問題ありません。ただし、コードには問題があります。プッシュは3 回しかありませんが、 16バイト減算されます。への移動eaxは、 を変更しないため、プッシュとしてカウントされませんesp

この小さなプログラムではおそらく問題にはなりませんが、まともなサイズのプログラムではクラッシュします。そのため、0x10 から 0x0Cpush eaxにorを追加しsub esp, 4てバランスを取り、BSD 呼び出し規約の要件に一致するように修正します。

別の方法は、事前にスタック領域を確保し、 esmovの代わりに s を使用して引数を設定することです。push

EDIT : FreeBSD 呼び出し規約に従ってコードを修正しました(余分なプッシュ)。

SECTION .text
    ; we only need 12 bytes (3 args) but BSD ABI needs one extra stack slot
    sub esp, 0x10  
    mov  eax, StringLen
    mov  [esp-C], eax
    mov  eax, StringLen
    mov  [esp-8], eax
    mov  dword [esp-4], 0x1 ; file descriptor (stdout)
    mov  eax, 4     ; system call number (sys_write)
    int  0x80       ; make the syscall

    mov dword [esp-4], 0 ; exit code
    mov eax, 1      ; system call number (sys_exit)
    int 0x80       ; System exit

    ; unreachable in this case but necessary for returning functions
    add esp, 0x10  ; restore the stack at the end of the function

ご覧のとおりESP、関数本体の大部分の during を変更する必要はありませんが、コードが大きくなり、冗長になります。movメモリからメモリへの変換はできないため、変数には一時レジスタを使用する必要があります。

何らかの理由で、引数を渡すこの方法は GCC のデフォルトであり、非常に測定可能なコードの肥大化をもたらします。

于 2013-03-14T15:36:05.563 に答える