x86-64汇编中函数的第一条指令为什么必须是push rdi,最后一条指令必须是pop rdi?

时间:2021-09-14 02:55:04
x86-64汇编中函数的第一条指令为什么必须是push rdi,最后一条指令必须是pop rdi?

10 个解决方案

#1


没接触过64位汇编,但我估计是不是也是为了堆栈平衡吧。

#2


不会是用RDI来代替RBP吧,个人猜测

#3


rdi是被调用者保存,如果中间用了rdi干别的事就要这样做

#4


没这个必须,x64函数内部如果使用了这些寄存器,必须先保存再修改,退出时恢复:rbx, rbp, rdi, rsi, r12, r13, r14, r15, xmm6 - xmm15, x87栈,否则不用。

#5


难道是传说中的hot-patch?
看看指令长度吧,没准真的是mov edi,edi一样的呢。

#6


4楼说的正解

#7


和X86 下的多数调用约定一样,除去易失性寄存器,都需要保存。

X64 下的易失性寄存器有 RAX RCX RDX R8 R9 R10 R11 XMML0-XMML3 XMM4 XMM5
X86 下有 EAX,ECX,EDX

#8


感觉4楼的是正确答案。。。

#9


这是起到保护寄存器内容的作用,也就是先把他的老本存起来,别一不小心在过程中把它修改了,等你的程序运行完了,再把它提取出来

#10


伪命题,根本不存在你所谓的必须。

#1


没接触过64位汇编,但我估计是不是也是为了堆栈平衡吧。

#2


不会是用RDI来代替RBP吧,个人猜测

#3


rdi是被调用者保存,如果中间用了rdi干别的事就要这样做

#4


没这个必须,x64函数内部如果使用了这些寄存器,必须先保存再修改,退出时恢复:rbx, rbp, rdi, rsi, r12, r13, r14, r15, xmm6 - xmm15, x87栈,否则不用。

#5


难道是传说中的hot-patch?
看看指令长度吧,没准真的是mov edi,edi一样的呢。

#6


4楼说的正解

#7


和X86 下的多数调用约定一样,除去易失性寄存器,都需要保存。

X64 下的易失性寄存器有 RAX RCX RDX R8 R9 R10 R11 XMML0-XMML3 XMM4 XMM5
X86 下有 EAX,ECX,EDX

#8


感觉4楼的是正确答案。。。

#9


这是起到保护寄存器内容的作用,也就是先把他的老本存起来,别一不小心在过程中把它修改了,等你的程序运行完了,再把它提取出来

#10


伪命题,根本不存在你所谓的必须。