gpt4 book ai didi

c - int 80 不出现在汇编代码中

转载 作者:行者123 更新时间:2023-12-04 11:08:32 24 4
gpt4 key购买 nike

问题

让我们考虑一下:

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位约定通过寄存器传递参数'引起的,而是由我们进行系统调用引起的。)

我的 64 位 Ubuntu 机器上的输出为: gcc -S main.c -m32是:
pushl   $4
pushl $string
pushl $1
call write

我的疑惑

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

最佳答案

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



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

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

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

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

顺便说一句,如果你想移植 gcc 怎么办?到使用 call 5 的完全不同的架构进行操作系统级别的系统调用。如果 gcc正在注入(inject)特定 int $80调用装配流,这不会很好地工作。

但是,如果它正在注入(inject)对 write() 的调用函数,您所要做的就是确保将它与包含修改的 write() 的正确库链接。函数(执行 call 5 而不是 int $80 的函数)。

关于c - int 80 不出现在汇编代码中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32056489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com