【发布时间】:2020-04-04 19:44:46
【问题描述】:
我正在 Darwin x86_64 (MacOS 10.14.6) 上编写一个简单的汇编程序,它会创建一个文件 (test.txt) 并将“E”写入其中。但是,由于某种原因,“E”没有写入文件。我做错了什么?
这是我的程序:
global start
section .text
start:
;Create the file
mov rax, 0x2000005
mov rdi, fname
mov rsi, 0x200
mov rdx, 0o644
syscall
;Write to file
mov rdi, rax ;As far as I know, this uses the fd returned by creating a file (previous syscall)
mov rsi, msg
mov rdx, 1
mov rax, 0x2000004
syscall
;Exit
mov rax, 0x2000001
mov rdi, 0
syscall
section .data
msg: db "E" ;Message
fname: db "test.txt" ;File name
我也试过这个:
global start
section .text
start:
mov rax, 0x2000005
mov rdi, fname
mov rsi, 0x200
mov rdx, 0o644
syscall
mov rdi, rax
mov rsi, msg
mov rdx, 2
mov rax, 0x2000004
syscall
mov rax, 0x2000001
mov rdi, 0
syscall
section .data
msg: db "E", -1
fname: db "test.txt", 0
但两者都不起作用。
【问题讨论】:
-
MacOS 系统调用返回值在 RAX 中,CF 指示它是错误代码还是正常。您可以在程序中使用
dtrace来跟踪系统调用并为您解码。 -
我注意到您的 fname 字符串上没有
, 0终止符。如果链接后还有其他字节,那就有问题了。 -
显然,然后使用
dtrace或调试器查看write系统调用的返回值。 (并验证参数)。这始终是找出系统调用为什么没有达到您想要的效果的第一步。 -
@a_random_programmer 啊,对不起。请改用
dtruss。 -
@a_random_programmer 啊,我多么讨厌现代 macOS。请参阅this answer了解如何使其工作。