无法在程序集中使用系统调用写入控制台
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
改为
我正在尝试使用 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
改为