写入中断内的eip寄存器。英特尔IA32 PC架构

时间:2015-10-20 17:07:11

标签: assembly x86 return intel i386

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

jmp eax 

eax的值移至EIP

你能告诉我如何做我想做的事吗?应该有一种方法,因为上下文切换必须以某种方式工作。

我的目标CPU是Intel 80386(i386)(Intel IA32 PC架构)。

1 个答案:

答案 0 :(得分:0)

我假设您处于保护模式。

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

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

在汇编中表示,英特尔语法 1

mov [esp + 04h], ret_addr 


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

完成的
  • push仅将偏移量放入堆栈

或之前,

  • {{1}将段选择器放入堆栈

在上面代码中指明的地方。