我正在尝试使用C标准库中的putchar
函数。看起来非常简单-您传入一个int,它将字符写入stdout。但是,当我编译并运行该程序时,什么也没发生。
# This doesn't work:
.section .text
.globl _start
_start:
mov $0x41, %dil
call putchar
mov $60, %rax
syscall
答案 0 :(得分:1)
您看不到任何输出,因为libc的IO包执行缓冲的IO,并且您在终止程序之前不刷新stdout
的缓冲区。此问题是一个更大的基础问题的征兆,即您没有正确初始化和取消初始化libc。在每个使用libc的程序中,您应该:
_start
,然后调用您的main
函数syscall
指令执行原始系统调用,而是使用libc提供的包装器exit
或从main
返回来正确终止程序cc
来链接程序,而不是直接调用链接编辑器来正确链接所有libc代码一旦您经验丰富,您可能会与这些建议背道而驰,但是这样做可能会产生您可能不知道的细微后果,因此,现在最好遵循这些规则。