sample:
pushq %rbp
movq %rsp, %rbp
movl %edi, -20(%rbp)
movl $1, -16(%rbp)
movl $0, -12(%rbp)
movl $0, -8(%rbp)
cmpl $2, -20(%rbp)
入力値が1であるとしましょう1を%rbpまたは%rspとして設定します
%ediの値よりも
sample:
pushq %rbp
movq %rsp, %rbp
movl %edi, -20(%rbp)
movl $1, -16(%rbp)
movl $0, -12(%rbp)
movl $0, -8(%rbp)
cmpl $2, -20(%rbp)
入力値が1であるとしましょう1を%rbpまたは%rspとして設定します
%ediの値よりも
このステップバイステップを見てみましょう:
sample
は最初にスタックフレームを設定します。pushq %rbp; movq %rsp, %rbp
edi
されます:movl %edi, -20(%rbp)
。rsp
これは、リーフ関数の場合は明示的にデクリメントしなくても問題ありません。movl $1, -16(%rbp); movl $0, -12(%rbp); movl $0, -8(%rbp)
。edi
スタックに保存されているの値-20(%rbp)
を2と比較します。その比較に基づいて何かを実行すると仮定すると(コードの残りの部分が関連している可能性があります)、関数への入力はの値である必要がありますedi
。これを理解する別の方法は、AMD64 ABIrdi
です。これは、関数に最初の引数を渡すために使用されることを指定します。sample
次に、の最初の引数が32ビット幅の整数であるとさらに推測できます。