【发布时间】:2019-03-24 18:31:12
【问题描述】:
我正在尝试使用 C 标准库中的 putchar 函数。看起来很简单——你传入一个 int,它将字符写入 stdout。但是,当我编译并运行这个程序时,什么都没有发生。
# This doesn't work:
.section .text
.globl _start
_start:
mov $0x41, %dil
call putchar
mov $60, %rax
syscall
【问题讨论】:
-
这是因为您的程序既没有正确初始化 libc 也没有正确取消初始化它,因此没有在退出时刷新缓冲区。要解决此问题,请从
main(而不是_start)启动您的程序,通过C 编译器链接并通过从main返回或调用exit来终止您的程序。 -
@fuz 啊,好的。因此,将系统调用中的现有行为更改为
call exit似乎使它起作用了。为什么会发生这种情况? -
这是因为 libc 确实缓冲了 I/O。退出时,输出缓冲区由函数
exit刷新。如果您不调用exit或手动刷新输出缓冲区,它们将不会被刷新。也就是说,仅仅调用exit是不够的!除非您还正确初始化了 libc(通过让您的程序从main开始并让 C 编译器提供_start来初始化 libc),否则如果您使用任何 libc 函数,可能会发生奇怪的事情。如果你使用 libc,你应该尽量不要直接调用任何系统调用。请改用 libc 函数! -
另一方面,如果你确实放弃使用
putchar,你可以使用write,它不需要任何初始化 -
@AnttiHaapala wait is
write只是 sys_write 系统调用的包装器?