int 80 没有出现在汇编代码中

int 80 doesn't appear in assembly code

问题

让我们考虑一下:

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

我正在阅读一本书,建议上述代码的汇编输出应该是:

main:
mov , %eax
mov  %ebx
mov %string, %ecx
mov $len, %edx
int [=11=]x80

(上面的代码是用32位架构编译的。寄存器传递参数不是由'64位寄存器传递参数约定'引起的,而是我们进行系统调用引起的。)

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

pushl   
pushl   $string
pushl   
call    write

我的疑惑

所以这让我很困惑。为什么 gcc 将其编译为 "normal" 调用,而不是系统调用。 在这种情况下,有什么方法可以让处理器使用内核函数(如write)?

I am reading a book that suggests the assembly output for the above code should be ...

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

没有要求将 C 代码转换为特定的汇编代码,C 标准强制要求的唯一要求是生成的代码以某种方式运行。

是否通过直接使用int (或sysenter)调用OS系统调用来完成,或者是否通过调用来完成 最终 以类似方式调用 OS 的库例程 write() 在很大程度上是无关紧要的。

如果您找到并反汇编 write() 代码,您可能会发现它只是将这些值从堆栈中读取到寄存器中,然后调用 OS 的方式与您显示的代码包含 int .


顺便说一句,如果您想将 gcc 移植到使用 call 5 执行 OS 级系统调用的完全不同的体系结构怎么办?如果 gcc 将特定的 int 调用注入汇编流,那将不会很好地工作。

但是,如果它正在注入对 write() 函数的调用,您所要做的就是确保 link 它使用包含修改后的 write() 函数的正确库(一个 call 5 而不是 int ).