让我们考虑:
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将其编译为“正常”调用,而不是系统调用。 在这种情况下,使处理器使用内核函数(如写入)的方式是什么?
gcc不保证遵守您的书。它正在编译它,同时调用'write',它是库函数/包装器。这可能会调用这个'int'。或者它不会... –
优化会发生什么? – Quentin
GCC不内联系统调用,它只是调用C运行时库中定义的函数。 C运行时库中的函数调用系统调用,但是正如Eugene所说,它可能不会使用'int $ 0x80'。 –