1

如果我在程序集上启动一个子过程,我的堆栈指针 %esp 在开始时瞄准一个返回值。

  1. 我怎么能想象呢?退货地址是什么意思?
  2. 它只是指向堆栈上另一个地址的指针吗?
  3. 如果它是一个地址,我在开始时执行此命令:
mov %esp,%edi     # copy return address to %edi
mov $0xff,%cl     # write 255 in %ecx (it was 0x0 before)
mov %ecx,(%edi)   # copy 255 to... the stack point, the return

地址是瞄准?# 还是直接覆盖返回地址?

4

1 回答 1

1
  1. 在英特尔上,在调用函数之前将返回地址推入堆栈是对的。

  2. 它不是堆栈的地址,而是被调用函数完成后要返回的指令的地址。例如,如果您有一个如下所示的程序:

     instruction1
     instruction2
     call someFunction
     instruction3
     instruction4
    

    完成someFunction后,它会跳回并从instruction3. 它知道要返回到哪里,因为在执行指令 instruction3时会将 的地址压入堆栈。将使用该地址将该地址从堆栈中弹出并返回。callsomeFunctionret

  3. 您的示例按照您的建议覆盖了函数的返回地址 - 您可能不想这样做。

于 2013-06-11T23:50:19.710 回答