Chi*_*ron 0 x86 assembly operating-system interrupt
例如x86指令:push可以精确地描述为:
push:\nsub esp, data_size\nmov [esp], data\nRun Code Online (Sandbox Code Playgroud)\n\n并且call可以描述为:
call:\npush (eip+2)\njmp addr\nRun 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\n据我所知,INT 按某种顺序推送 eip、4 个通用寄存器、eflags 和一些奇怪的东西。
\n\n我观察到当我调用它时它在堆栈上消耗了 6 个字节,
\n\n当硬件触发时,它消耗18个字节。(如时钟)
\n\n补充:我的代码
\n\n\n
\n\n- \n
将 ivt 0x1ch(系统定时器 Tick) 挂钩到我的函数 [foo]
- \n
科学技术
- \n
跳$
- \n
foo: 打印\'A\'
\n
jmp $我在进入之前检查堆栈foo
我观察到当我调用它时它在堆栈上消耗了 6 个字节
从这一行和标签“操作系统”我得出结论,您已经使用了int实地址模式中的指令。在这种情况下,堆栈将在中断处理程序开始时保存 3 个字。
第一个压入的字(内存中最高的)是寄存器FLAGS,压入的第二个字是寄存器CS,压入的第三个字(内存中最低的)是寄存器IP。
现在,我想在 INT 调用后修改堆栈,使我的程序返回到另一个地方。
您可以自由地用这三个词中的任何一个或所有词写任何合适的内容。
要返回到不同的地址但仍在同一代码段中,您可以编写:
mov word ptr [esp], OtherLabel
iret
Run Code Online (Sandbox Code Playgroud)要返回并设置 CarryFlag,请编写:
or word ptr [esp+4], 1
iret
Run Code Online (Sandbox Code Playgroud)