INT 指令的具体行为是什么?

Chi*_*ron 0 x86 assembly operating-system interrupt

例如x86指令:push可以精确地描述为:

\n\n
push:\nsub esp, data_size\nmov [esp], data\n
Run Code Online (Sandbox Code Playgroud)\n\n

并且call可以描述为:

\n\n
call:\npush (eip+2)\njmp addr\n
Run Code Online (Sandbox Code Playgroud)\n\n

通过了解这些,我们将完全清楚这些指令如何影响堆栈、寄存器和标志,我认为这是至关重要的。

\n\n

然而,在阅读《Intel\xc2\xae 64 和 IA-32 架构软件开发人员\xe2\x80\x99s 手册》之后。和“i386程序员手册”我没有找到有关INT指令的确切行为的信息。

\n\n

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

\n\n

那么,INT被调用之后到底做了什么呢?

\n\n

(由程序员或硬件。我听说他们的行为不同)

\n\n

提前致谢!!

\n\n
\n

附:

\n\n

据我所知,INT 按某种顺序推送 eip、4 个通用寄存器、eflags 和一些奇怪的东西。

\n\n

我观察到当我调用它时它在堆栈上消耗了 6 个字节,

\n\n

当硬件触发时,它消耗18个字节。(如时钟)

\n\n

补充:我的代码

\n\n
    \n
  1. 将 ivt 0x1ch(系统定时器 Tick) 挂钩到我的函数 [foo]

  2. \n
  3. 科学技术

  4. \n
  5. 跳$

  6. \n
  7. foo: 打印\'A\'

  8. \n
\n\n

jmp $我在进入之前检查堆栈foo

\n
\n

Fif*_*nik 5

我观察到当我调用它时它在堆栈上消耗了 6 个字节

从这一行和标签“操作系统”我得出结论,您已经使用了int实地址模式中的指令。在这种情况下,堆栈将在中断处理程序开始时保存 3 个字。

第一个压入的字(内存中最高的)是寄存器FLAGS,压入的第二个字是寄存器CS,压入的第三个字(内存中最低的)是寄存器IP

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

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