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 ABI,它指定rdi
用于将第一个参数传递给函数。然后,您可以进一步推断第一个参数sample
是一个 32 位宽的整数。