R..*_*R.. 2 c x86 assembly longjmp
仅以i386为例,但是类似的问题适用于其他拱门。传统I386 jmp_buf通过保存setjmp由6个保存的寄存器:ebx,esi,edi,ebp,esp,和eip。其中,前4个是根据ABI保存的调用方,因此被调用的函数setjmp本身将使用自己保存的值覆盖它们(该值在的第一个和第二个返回之间可能会发生变化setjmp)。因此,将这些寄存器全部保存在其中有jmp_buf什么意义?仅保存堆栈和指令指针不是很好吗?
编辑:我错误地混淆了保存主叫方和保存被叫方,这是造成混乱的全部原因。很抱歉浪费大家的时间。
setjmp / longjmp对不是“ goto”组合,而是“ save-state / restore-state”组合……如果大多数寄存器未保存,则将无法实现。例外是子例程返回寄存器,因此您可以确定是从正常调用setjmp还是通过longjmp返回的。
编辑-尽管应该将您所提出的四个问题保存为呼叫者,但setjmp()不会信任您...并且它将做正确的事,无论您做了什么;)
| 归档时间: |
|
| 查看次数: |
943 次 |
| 最近记录: |