【问题标题】:What is "int 80h" in Linux? [duplicate]Linux 中的“int 80h”是什么? [复制]
【发布时间】:2020-12-03 20:17:49
【问题描述】:

我想了解我们为什么使用int 80h 以及在汇编代码中调用它之后会发生什么。喜欢这里:

int 80h
mov eax,1
int 80h

它怎么知道我要调用系统退出,而不仅仅是在eax中保存十进制数?

【问题讨论】:

标签: linux assembly linux-kernel x86 system-calls


【解决方案1】:

INT 是“中断”的汇编助记符。它后面的代码指定了中断代码。 (十进制的 80h/0x80 或 128 是 Unix 系统调用中断) 在实模式下运行时(32 位芯片上的 16 位),中断由 BIOS 处理。在操作系统之上运行时,中断由操作系统通过在启动时加载的中断描述符表 (IDT) 处理。

如果 CPU 遇到INT 指令,它将在 BIOS 的 IVT 或操作系统的 IDT 中查找中断,并为该特定中断代码找到附加的处理程序。然后它会跳转到IDT/IVT指定的那段代码,开始执行,当到达处理程序中的特殊指令IRET时,会跳转回调用INT的代码,表示系统结束执行中断。

一些中断处理程序使用寄存器来了解更多信息,有点像将参数传递给高级语言中的函数。因此,当您将1 写入EAX 时,接收您的中断的处理程序将看到EAX 设置为1,并知道您想要什么,例如您想要使用的系统资源。

【讨论】:

  • 首先感谢所有回复此问题的人,但我想了解为了调用任何系统调用,我必须先调用 int 80h,然后再调用“系统调用”吗?必须以 int 80h 结束?
  • 系统调用就像一个函数。您可以通过编写INT 80h 来调用该函数。您不需要结束系统调用,或执行任何功能;这一切都由操作系统处理。
  • 非常感谢,我知道我有很多问题,我要问另一个问题,所以请看一下。
  • 尝试将变量移动到 AL 或 AX 时出现错误,例如:“VARIABLE DB 15h”然后尝试执行此操作时“MOV AL, VARIABLE”它给了我“(.text+0x1) : 重定位被截断以适应:R_386_8 对 `.data' "
  • (假设您使用的是 NASM) VARIABLE db 15h 将在内存中的该点放置一个字节(15h),地址为“VARIABLE”。要在您的程序中引用它,请写MOV AL, [VARIABLE]。 “VARIABLE”周围的方括号表示您正在寻找内存地址“VARIABLE”处的值,而不是“VARIABLE”本身的值,它是一个内存位置
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 2017-11-12
  • 2016-03-09
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多