为什么汇编能用CALL却用INT指令?

Why does assembly use INT instruction when it can use CALL?

如果我没记错的话,执行INT基本上是一个软件子程序。明明可以用CALL来执行这些中断例程,为什么还有INT指令?

使用 INT 使 API 非常通用并且独立于定义它的系统中所有函数入口点的位置。您不需要将所有外部符号都定义为 link 的库。例如,您只需调用 INT xxH 以获得某个值 xx 并以某种方式设置寄存器。如果使用 CALL,则必须直接通过 link 库或通过已知 table 或其他位置间接知道函数的地址,这仍然需要 link table 个位置的库。

像您的 BIOS 这样的子系统使用这种方法是因为它们不必发布一堆单独函数的地址,或者不可能维护分配 link/lib 的任务适用于您可能拥有的每个可以想象的操作系统或开发工具的文件。 (更不用说,您可能正在编写自己的 OS。)而且对于不同的 PC 硬件制造商,它也可能会有所不同。 INT 机制完全独立于所有这些。

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