我正在尝试使用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/来查找系统调用信息。我一直在挠头两个小时。
当我运行程序时,它不会打印任何内容。
答案 0 :(得分:1)
两个问题
在调用sys_write之前,你没有设置%edi(要写入的fd),所以它会写入%edi中的任何内容。既然这是在新启动的进程中运行的第一件事,那么它将为0,因此它将写入stdin。由于stdin通常与stdout的终端相同,所以没关系
您将字符串加载到%esi,而不是字符串的地址。指令
movq .LC0(%rip), %rsi
将从.LC0的内存加载8个字节到rsi。尝试
lea .LC0(%rip), %rsi
代替