Assembly 在中断内写入eip寄存器。英特尔IA32 PC体系结构

Assembly 在中断内写入eip寄存器。英特尔IA32 PC体系结构,assembly,x86,return,intel,i386,Assembly,X86,Return,Intel,I386,在中断内部,我想以某种方式写入一个函数的地址,并在中断结束后转到这个地址到EIP寄存器中。但我的程序似乎在设置EIP寄存器后立即转到这个地址。 我用 将eax的值移动到EIP中 你能告诉我怎么做我想做的事吗?应该有办法,因为上下文切换必须以某种方式起作用 我的目标CPU是Intel 80386 i386 Intel IA32 PC体系结构。我假设您处于保护模式 每个中断都在堆栈上存储一个返回地址,当遇到iret指令时,它会跳转到该地址 如果触发中断,CPU将按下返回地址段选择器+偏移量,然后按下

在中断内部,我想以某种方式写入一个函数的地址,并在中断结束后转到这个地址到EIP寄存器中。但我的程序似乎在设置EIP寄存器后立即转到这个地址。 我用

将eax的值移动到EIP中

你能告诉我怎么做我想做的事吗?应该有办法,因为上下文切换必须以某种方式起作用


我的目标CPU是Intel 80386 i386 Intel IA32 PC体系结构。

我假设您处于保护模式

每个中断都在堆栈上存储一个返回地址,当遇到iret指令时,它会跳转到该地址

如果触发中断,CPU将按下返回地址段选择器+偏移量,然后按下堆栈上eflags寄存器的内容。 因此,为了用其他值替换返回地址的偏移量,您需要将返回地址移动到esp+sizeofefflags=esp+04h

以汇编形式表示,英特尔语法1:

现在,当执行iret指令时,ISR将跳转到ret_addr所指向的代码。 但是,请注意,如果目标代码由ret(即函数)终止,则还需要在堆栈上推送返回地址。这是通过

仅将偏移推送到堆栈上 或者,在那之前

将段选择器推到堆栈上 如上述代码所示


您处理中断的确切程序是什么?您应该使用iret从中断处理过程返回。如果没有更多的上下文,这个问题是无法回答的。当然,您应该只更新堆栈上的EIP。这将由IRET弹出。对于每个上下文,上下文切换可能有一个单独的堆栈。和保存的寄存器值。如果您的中断是计时器滴答声,您可能希望稍后恢复中断的代码。不只是跳到别的地方然后忘记你从哪里来。我想在我的中断中进行上下文切换。在中断内部,我将进程的上下文推送到它的堆栈中,然后从它的堆栈中弹出另一个进程的上下文。问题是,当我试图通过pop eax将地址写入EIP,然后通过jmp eax时,我真的从中断跳到了这个地址。但我不希望发生这种情况,我想继续我的中断,并在我完成我的中断时转到这个地址。我想有人给我建议怎么做…我相信它看起来很合理,我会尝试,谢谢你,如果它自动按下并弹出这些寄存器,我宁愿不要触摸这些寄存器。我只是将指针切换到堆栈,它会自动弹出新数据。@KosTTT我编辑了如何替换返回地址。希望这样更好。
jmp eax 
mov [esp + 04h], ret_addr