在中断内部我想以某种方式写入函数的地址,并在中断结束到EIP
寄存器后转到该地址。但似乎我的程序在设置EIP
注册后立即转到此地址
我用
jmp eax
将eax
的值移至EIP
。
你能告诉我如何做我想做的事吗?应该有一种方法,因为上下文切换必须以某种方式工作。
我的目标CPU是Intel 80386(i386)(Intel IA32 PC架构)。
答案 0 :(得分:0)
我假设您处于保护模式。
每个中断都在堆栈上存储一个返回地址,当遇到iret
指令时,它会跳转到该地址。
如果触发了中断,CPU会按下返回地址(段选择器+偏移量),之后是堆栈上eflags
寄存器的内容。
因此,为了将返回地址偏移量替换为其他值,您需要将返回地址移至esp + sizeof(eflags) = esp + 04h
。
在汇编中表示,英特尔语法 1 :
mov [esp + 04h], ret_addr
现在,当执行iret
指令时,ISR将跳转到指向的ret_addr
代码。
但是,请注意,如果目标代码由ret
终止(即函数),则还需要在堆栈上按下返回地址。这是通过
push
仅将偏移量放入堆栈或之前,
在上面代码中指明的地方。