无法在汇编中调用`putchar`

时间:2019-03-24 18:31:12

标签: c assembly x86

我正在尝试使用C标准库中的putchar函数。看起来非常简单-您传入一个int,它将字符写入stdout。但是,当我编译并运行该程序时,什么也没发生。

    # This doesn't work:
    .section .text
    .globl _start

_start:
    mov $0x41, %dil
    call putchar

    mov $60, %rax
    syscall

1 个答案:

答案 0 :(得分:1)

您看不到任何输出,因为libc的IO包执行缓冲的IO,并且您在终止程序之前不刷新stdout的缓冲区。此问题是一个更大的基础问题的征兆,即您没有正确初始化和取消初始化libc。在每个使用libc的程序中,您应该:

  1. 让libc在启动时自行初始化,让其初始化代码为_start,然后调用您的main函数
  2. 不通过syscall指令执行原始系统调用,而是使用libc提供的包装器
  3. 通过调用exit或从main返回来正确终止程序
  4. 通过使用C编译器驱动程序cc来链接程序,而不是直接调用链接编辑器来正确链接所有libc代码

一旦您经验丰富,您可能会与这些建议背道而驰,但是这样做可能会产生您可能不知道的细微后果,因此,现在最好遵循这些规则。