被调用者在函数调用后保留EBX、ESI和EDI的内容



我正在通过一本书学习RE。

它说,当Callee函数被控制时,它会做3件事:

  1. 设置函数堆栈框架
  2. 为局部变量分配空间
  3. 如果需要,保留EBX、ESI、EDI

为什么需要步骤3?在保存之前,它们的目的是什么?根据这本书,EBX被用作指向数据的指针,ESI被用作字符串操作中指向源的指针,EDI被用作指向目标字符串操作的指针。

为什么不在调用被调用方函数之前执行步骤3,即当EAX、ECX和EDX寄存器被推送到堆栈上时?

有很多调用约定。阿格纳·福格有一份关于其中一些的文件。

Callee保存寄存器是在使用之前必须保存的寄存器并在使用后恢复。

假设一个函数很小,并且不使用/修改这些寄存器。这样就不必保存和恢复它们。它甚至可以调用其他函数来保存/修改/恢复这些寄存器。但它本身不必保存/恢复它们。

但是,如果它确实使用/修改了它们,那么它必须在修改之前保存它们,并在返回给调用者之前恢复它们。

最新更新