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

时间:2018-03-30 01:58:49

标签: assembly x86-64 gnu att

我正在尝试使用atc语法的syscall手动编写。我使用命令gcc -nostdlib file.s来编译代码。

这是我的代码:

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

.text
exit:
    movq $0, %rdi
    movq $60, %rax
    syscall

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

    mov $44, %rax
    pushq %rax

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

    call exit

我使用此表http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/来查找系统调用信息。我一直在挠头两个小时。

当我运行程序时,它不会打印任何内容。

1 个答案:

答案 0 :(得分:1)

两个问题

  • 在调用sys_write之前,你没有设置%edi(要写入的fd),所以它会写入%edi中的任何内容。既然这是在新启动的进程中运行的第一件事,那么它将为0,因此它将写入stdin。由于stdin通常与stdout的终端相同,所以没关系

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

    movq .LC0(%rip), %rsi

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

lea .LC0(%rip), %rsi

代替