无法在程序集中使用系统调用写入控制台

Not able to write to console using syscall in assembly

我正在尝试使用 at&t 语法中的系统调用手动编写。我使用命令 gcc -nostdlib file.s 来编译代码。

这是我的代码:

.section    .rodata
.LC0:
    .string "abc\n"

.text
exit:
    movq [=10=], %rdi
    movq , %rax
    syscall

.globl _start
_start:
    pushq %rbp
    movq %rsp, %rbp

    mov , %rax
    pushq %rax

    movq , %rax
    movq .LC0(%rip), %rsi
    movq , %rdx
    syscall

    call exit

我用这个 table http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/ 来查找系统调用信息。挠了挠头两个小时

当我 运行 程序时它不打印任何东西。

两个问题

  • 您在调用 sys_write 之前没有设置 %edi(要写入的 fd),因此它会写入 %edi 中的任何内容。现在,由于这是新启动进程中 运行 的第一件事,它将为 0,因此它将写入标准输入。由于stdin一般和stdout是同一个终端,这样就可以了

  • 您将字符串加载到 %esi,而不是字符串的地址。指令

    movq .LC0(%rip), %rsi

将从 .LC0 的内存加载 8 个字节到 rsi。尝试

lea .LC0(%rip), %rsi

改为