Macos 将字符打印到标准输出x86 mac

Macos 将字符打印到标准输出x86 mac,macos,assembly,x86-64,stdout,calling-convention,Macos,Assembly,X86 64,Stdout,Calling Convention,我在Mac上,我正试图在X86汇编中向标准输出一个字符。我在网上还没有找到任何对我有用的例子——不过,这是最接近我的例子。通过如下方式组合它:gcc-masm=intel print.asm我得到以下输出: Undefined symbols for architecture x86_64: "putchar", referenced from: _main in print-c2eebf.o ld: symbol(s) not found for archi

我在Mac上,我正试图在X86汇编中向标准输出一个字符。我在网上还没有找到任何对我有用的例子——不过,这是最接近我的例子。通过如下方式组合它:
gcc-masm=intel print.asm
我得到以下输出:

Undefined symbols for architecture x86_64:
  "putchar", referenced from:
      _main in print-c2eebf.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
这是我的铿锵版本:

Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 11.0.3 (clang-1103.0.32.62)
Target: x86_64-apple-darwin19.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
这是我的密码:

    .global _main, putchar
    .text

_main:
    push 0x21  # put exclamation point on stack
    call putchar

    mov rdi, 0  # exit code of zero
    mov rax, 0x2000001
    syscall

这真是令人沮丧,我不知道如何使它正常工作。有人有解决方案吗?

64位调用约定不使用堆栈来传递前几个参数,如果情况允许的话。尝试
movedi';改为调用putchar
。由于链接器错误,您可能需要使用下划线前缀,因此
call\u putchar
。从
.global
行中删除
putchar
,因为这不是您试图导出的符号。@Jester当我使用_putchar时,它似乎正在编译,但它不会在屏幕上打印任何内容。当将该值移动到edi时,我得到一个分段错误。我从.global行中删除了putchar,但它运行的是相同的。谢谢你的提示。
stdout
通常是行缓冲的。由于使用退出系统调用,因此可能不会刷新该缓冲区。改为使用
ret
结束代码。@Jester仍然存在相同的分段错误。我将使用调试器逐步完成它,并让您知道我发现了什么我忘了在链接重复项时您使用的是GAS.intel_语法,而不是NASM。使用RIP相对寻址模式,这就是使用LEA的意义所在
leardi,[RIP+msg]
。希望您在谷歌搜索后发现,64位模式下不支持32位绝对寻址。请注意,
-O0
与asm源文件无关;这是一个C->asm优化选项。