我已经查看了类似的问题,但似乎找不到我的代码出了什么问题。
我正在尝试在MacOS上进行“write”系统调用,以将字符串打印到标准输出。
我能够使用printf
完美地完成此操作,并且熟悉在x64汇编中调用其他函数。
然而,这是我第一次尝试使用syscall
。
我正在使用GCC的GAS汇编器。
这是我的代码:
.section __TEXT,__text
.globl _main
_main:
pushq %rbp
movq %rsp, %rbp
subq $32, %rsp
movq $0x20000004, %rax
movq $1, %rdi
leaq syscall_str(%rip), %rsi
movq $25, %rdx
syscall
jc error
xorq %rax, %rax
leave
ret
error:
movq $1, %rax
leave
ret
.section __DATA,__data
syscall_str:
.asciz "Printed with a syscall.\n"
看起来没有任何错误;只是没有将任何内容写入stdout
。
我知道在MacOS上,start
通常用作可执行文件的起始点,但它无法与GCC编译。
movq $0x20000004, %rax
应该是movq $0x2000004, %rax
(少一个0) - Michael Petchdtruss
跟踪程序的系统调用。 - fuz