例如 x86 说明:push
可以精确描述:
push:
sub esp, data_size
mov [esp], data
call
可以通过以下方式描述:
call:
push (eip+2)
jmp addr
通过了解这些,我们将完全清楚这些指令如何影响堆栈,寄存器和标志,我认为这是至关重要的。
然而,在阅读“英特尔®64和IA-32架构软件开发人员手册”之后。和“i386程序员手册”我没有发现INT指令的确切行为。
现在,我想在INT调用后修改堆栈,使我的程序返回到另一个地方。
那么,INT在调用之后究竟做了什么?
(由程序员或硬件。我听说他们的行为不同)
提前致谢!!
ps:
据我所知,INT推送eip,4个通用寄存器,eflags和 某些奇怪的东西按某种顺序排列。
我发现当我调用它时,它在堆栈上消耗了6个字节,
由硬件触发时消耗18个字节(如时钟)
补充:我的代码
hook ivt 0x1ch(系统计时器勾选)到我的函数[foo]
STI
jmp $
- 醇>
foo:打印'A'
我在
之前检查了堆栈jmp $
和foo
答案 0 :(得分:3)
我发现当我调用它时,它在堆栈上消耗了6个字节
从这一行和标签“operating-system”我得出结论,你已经使用了实地址模式的int
指令。在这种情况下,堆栈将在中断处理程序的开头保留3个字。
第一个字被推(内存中最高)是FLAGS
寄存器,第二个字是CS
寄存器,第三个字被推(内存最低)是{{1}注册。
现在,我想在INT调用后修改堆栈,使我的程序返回到另一个地方。
您可以自由地编写适合任何或所有这三个单词的内容。
要返回不同的地址,但仍在同一代码段中,您可以写:
IP
要使用CarryFlag设置返回,请编写:
mov word ptr [esp], OtherLabel
iret