Assembly 当程序集可以使用调用时,为什么要使用INT指令?

Assembly 当程序集可以使用调用时,为什么要使用INT指令?,assembly,Assembly,如果我没弄错的话,执行INT基本上是一个软件子例程。当您可以使用CALL执行这些中断例程时,为什么会有INT指令?使用INT使API非常通用,并且与定义它的系统中所有函数入口点的位置无关。您不需要一个包含所有定义为链接到的外部符号的库。您只需调用intxxh,例如,对于某个值xx,并以特定方式设置寄存器。如果使用调用,则必须直接通过链接库或通过已知表或其他位置间接了解函数的地址,这些位置可能仍然需要表位置的链接库 像BIOS这样的子系统使用这种方法,因为这样它们就不必发布一组单独函数的地址,也不

如果我没弄错的话,执行INT基本上是一个软件子例程。当您可以使用CALL执行这些中断例程时,为什么会有INT指令?

使用
INT
使API非常通用,并且与定义它的系统中所有函数入口点的位置无关。您不需要一个包含所有定义为链接到的外部符号的库。您只需调用
intxxh
,例如,对于某个值
xx
,并以特定方式设置寄存器。如果使用
调用
,则必须直接通过链接库或通过已知表或其他位置间接了解函数的地址,这些位置可能仍然需要表位置的链接库

像BIOS这样的子系统使用这种方法,因为这样它们就不必发布一组单独函数的地址,也不必为您可能拥有的每个可能的操作系统或开发工具分发链接/库文件。(更不用说,您可能正在编写自己的操作系统。)而且,对于不同的PC硬件制造商,操作系统可能也会有所不同。
INT
机制完全独立于所有这些


如果您有一组由特定软件中断和寄存器设置提供服务的函数,您可以根据需要更改所有函数的位置,并且函数集合仍将与使用中断的所有软件兼容。对于BIOS或Linux系统调用等功能非常方便。

在我的脑海中。。。当你试图模拟硬件中断时,如果一个api记录了中断+值,那么它看起来比记录为far调用时更干净,int指令在进行调用的同时推送标志..这是非常老式的,但它提供了额外的间接级别。您不必知道例程位于哪个特定地址,中断向量提供了它。当操作系统发生变化时,无需重新生成程序。Linux系统调用不同,因为您还需要从用户空间(环3)切换到内核(环0)。我想也许你可以用远端调用和调用门之类的东西来实现,但是没有理由期望它比
syscall
指令更快。