我在网上搜索了一下,但是没有找到汇编语言中int和call之间的区别。那么int和call汇编指令有什么区别呢?
它们都可以调用某些函数。 "int"指令调用系统函数, "call"指令调用用户函数。
但是在实模式下它们是否相同? 我无法理解它们之间的区别。
此外,int指令是否调用了BIOS中定义的IVT(中断向量表)? 但是,call指令也可以执行相同的操作吗?为什么需要将其分开使用?
我在网上搜索了一下,但是没有找到汇编语言中int和call之间的区别。那么int和call汇编指令有什么区别呢?
它们都可以调用某些函数。 "int"指令调用系统函数, "call"指令调用用户函数。
但是在实模式下它们是否相同? 我无法理解它们之间的区别。
此外,int指令是否调用了BIOS中定义的IVT(中断向量表)? 但是,call指令也可以执行相同的操作吗?为什么需要将其分开使用?
表面上看,区别在于:
CALL获取过程地址,可以是近址或远址,并以常数或寄存器提供。而INT获取中断号,在实模式下用作中断向量表0000:0000中的索引,以查找地址。CALL将返回地址(近址或远址)压入堆栈;而INT则将标志寄存器和返回地址(始终为远址)压入堆栈。
在保护模式下,INT有所不同。它涉及用户到内核模式的切换。
INT用于消费BIOS和DOS的服务。CALL用于调用您自己的过程。您可以使中断向量指向您的一个过程,但这有什么意义呢?
一些具有供其他程序使用的服务的实模式DOS程序也用于挂接中断向量。例如,Microsoft鼠标驱动程序(一个常规的程序,而不是DOS的一部分)会挂接INT 33h向量,程序会使用它与鼠标交互。为了使向量保持有效,这些程序必须留驻在内存中。
int
并没有太大的区别。它仍然根据内核维护的表将控制权传递给中断处理程序。它仍然会将 EFLAGS 和 CS:EIP 推入内核堆栈(但这只是一个小差异)。它仍然主要用于调用内核中的函数,例如通过在寄存器中放置参数和系统调用代码来从 32 位 Linux 或 *BSD 用户空间使用 int 0x80
,就像 DOS/BIOS int
调用的 ABI 一样。 - Peter Cordescall gate
和interrupt gate
...),并熟悉外部参考资料。
最重要的参考资料之一是Intel® 64和IA-32体系结构软件开发者手册,其中第6章→过程调用、中断和异常应该能够回答你想了解的所有信息。