【问题标题】:Getting return value of syscall in assembly在程序集中获取系统调用的返回值
【发布时间】: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了解如何使其工作。

标签: macos assembly x86-64


【解决方案1】:

我找到了答案:

我发现用创建模式和写入模式打开文件是可行的。

global start
section .text
    start:
        ;Open file with create mode and write mode
        mov rax, 0x2000005
        mov rdi, fname
        mov rsi, 0x201
        mov rdx, 0o644
        syscall

        ;Now write
        mov rdi, rax
        mov rsi, msg
        mov rdx, 1
        mov rax, 0x2000004
        syscall

        ;Exit
        mov rax, 0x2000001
        mov rdi, 0
        syscall
section .data
    msg: db "E"
    fname: db "test.txt"

另外,这里有一组用于打开文件的标志:

O_ACCMODE: 0x3
O_APPEND: 0x8
O_ASYNC: 0x40
O_CLOEXEC: 0x1000000
O_CREAT: 0x200
O_DIRECTORY: 0x100000
O_DSYNC: 0x400000
O_EXCL: 0x800
O_EXLOCK: 0x20
O_NDELAY: 0x4
O_NOCTTY: 0x20000
O_NOFOLLOW: 0x100
O_NONBLOCK: 0x4
O_RDONLY: 0x0
O_RDWR: 0x2
O_SHLOCK: 0x10
O_SYNC: 0x80
O_TRUNC: 0x400
O_WRONLY: 0x1

要组合,请使用 | 运算符(在 C 中)或 or(在汇编中)。

【讨论】:

  • 感谢您撰写本文!是的,这是一个容易犯的错误。如果您不打开文件进行写入,则不允许您写入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 2012-02-11
  • 1970-01-01
  • 2018-05-17
  • 2021-10-13
  • 2012-10-07
相关资源
最近更新 更多