2015-08-17 20 views
3

问题INT 80没有出现在汇编代码

让我们考虑:

int main(){ 
write(1, "hello", 5); 
return 0; 
} 

我正在读一本书,提出了上面的代码汇编输出应该是:

main: 
mov $4, %eax 
mov $1 %ebx 
mov %string, %ecx 
mov $len, %edx 
int $0x80 

(上面的代码与32位架构编译。通过寄存器传递参数不是由寄存器引起'64位惯例传递参数,但它是CA事实上,我们使用系统调用。 )

而我的64位的Ubuntu机器上的输出与:gcc -S main.c -m32 是:

pushl $4 
pushl $string 
pushl $1 
call write 

我怀疑

所以这让我感到困惑。为什么gcc将其编译为“正常”调用,而不是系统调用。 在这种情况下,使处理器使用内核函数(如写入)的方式是什么?

+4

gcc不保证遵守您的书。它正在编译它,同时调用'write',它是库函数/包装器。这可能会调用这个'int'。或者它不会... –

+0

优化会发生什么? – Quentin

+2

GCC不内联系统调用,它只是调用C运行时库中定义的函数。 C运行时库中的函数调用系统调用,但是正如Eugene所说,它可能不会使用'int $ 0x80'。 –

回答

4

我正在读一本书,提出了上面的代码应该是装配输出...

你不应该相信你读到的一切:-)

没有要求该C代码变成特定汇编代码,即C标准的任务是唯一的要求,即所得到的代码的行为以某种方式。

不管是通过直接进行调用与int $80(或sysenter)的OS系统调用,或不管它是通过调用库函数write()最终呼吁以类似的方式在OS完成的,基本上是无能为力的。

如果您要查找并反汇编write()代码,您可能会发现它只是将这些值从堆栈中读取到寄存器中,然后以与您所显示的包含int $80的代码几乎相同的方式调用操作系统。


顺便说一句,如果你想端口gcc到使用call 5做操作系统级的系统调用一个完全不同的架构是什么。如果gcc被注入特定int $80调用到组件流,这是行不通的太清楚​​了。

但是,如果它注入调用一个函数write(),所有你需要做的就是确保你与含有改性write()函数(一个没有call 5而非int $80)正确的库链接。