0
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の値よりも

4

1 に答える 1

2

このステップバイステップを見てみましょう:

  • この関数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ビット幅の整数であるとさらに推測できます。

于 2012-11-05T02:55:04.467 に答える