我想设置esp
取决于eip
,因此我无法使用堆栈。如何在没有堆栈的情况下获得eip
的值。
答案 0 :(得分:5)
不,这在x86-32中是不可能的。 EIP仅通过call
指令或中断/陷阱从CPU泄漏。所有这些方法都会以某种方式使用堆栈。
(相比之下,x86-64允许您相对于lea
rip
。)
答案 1 :(得分:1)
如果无法更改ESP,则必须在某些无法中断的上下文中执行,例如某些中断例程或上下文切换代码,或者ESP中有垃圾。 (在后一种情况下,我建议你修改你的代码,这样ESP总是指向一个可用于堆栈的区域;这在实践中不难安排,并且在使用垃圾ESP时防止代码中存在非常奇怪的错误。)
在这种情况下,您可以将所需的EIP值编码为mov立即指令操作数。您可以在汇编程序中编写以下内容以“获取EIP”:
mov ecx, offset $ ; different assemblers use different syntax for "current address"
或
mov ecx, offset L1
L1: ...
如果你不是用汇编语言编写的,你可以使用$ B8“mov”操作码生成上面的二进制等价物,提供正确的寄存器值,并用你放置mov的位置填充immediate32值指令。