INT指令的确切行为是什么?

时间:2016-11-18 04:22:31

标签: assembly x86 operating-system interrupt

例如 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个字节(如时钟)

     

补充:我的代码

     
      
  1. hook ivt 0x1ch(系统计时器勾选)到我的函数[foo]

  2.   
  3. STI

  4.   
  5. jmp $

  6.   
  7. foo:打印'A'

  8.         

    我在jmp $foo

    之前检查了堆栈

1 个答案:

答案 0 :(得分:3)

  

我发现当我调用它时,它在堆栈上消耗了6个字节

从这一行和标签“operating-system”我得出结论,你已经使用了实地址模式的int指令。在这种情况下,堆栈将在中断处理程序的开头保留3个字。

第一个字被推(内存中最高)是FLAGS寄存器,第二个字是CS寄存器,第三个字被推(内存最低)是{{1}注册。

  

现在,我想在INT调用后修改堆栈,使我的程序返回到另一个地方。

您可以自由地编写适合任何或所有这三个单词的内容。

  • 要返回不同的地址,但仍在同一代码段中,您可以写:

    IP
  • 要使用CarryFlag设置返回,请编写:

    mov word ptr [esp], OtherLabel
    iret