日期:2014-05-16  浏览次数:20658 次

求助一条Linux下AT&T的汇编语句
int res;
int fd;
...
...
__asm__ ("int $0x80" \
  : "=a" (res) \
  : "0" (5), "b"(fd));

我想问的是, 开头引号中那句"int $0x80"是什么意思? 是不是和中断有关?

------解决方案--------------------
是的0x80中断,系统调用中断,也就是系统从用户层切换到内核层的中断

Linux 下的系统调用是通过中断(int 0x80)来实现的。在执行 int 80 指令时,寄存器 eax 中存放的是系统调用的功能号,而传给系统调用的参数则必须按顺序放到寄存器 ebx,ecx,edx,esi,edi 中,当系统调用完成之后,返回值可以在寄存器 eax 中获得。

------解决方案--------------------
还有系统调用表 entry.s

当在程序代码中用到系统调用时,编译器会将宏展开,展开后的代码实际上是将系统调用号放入ax后移用int 0x80使处理器转向系统调用入口,然后查找系统调用表entry.s,进而由内核调用真正的功能函数。