Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 获取程序集中syscall的返回值_Macos_Assembly_X86 64 - Fatal编程技术网

Macos 获取程序集中syscall的返回值

Macos 获取程序集中syscall的返回值,macos,assembly,x86-64,Macos,Assembly,X86 64,我正在Darwinx86_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

我正在Darwinx86_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
但两者都不起作用。

我找到了答案:

我发现用create模式和write模式打开文件是有效的

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中)或
(在汇编中)。

MacOS系统调用返回值以RAX为单位,CF指示它是错误代码还是正常。您可以在程序中使用
dtrace
来跟踪系统调用并对其进行解码。我注意到您的fname字符串中没有
,0
终止符。如果链接后有其他字节,这就是问题。然后使用
dtrace
或调试器查看
write
系统调用的返回值。(并验证args)。这始终是找出为什么系统调用没有按您的要求执行的第一步。@a_random_程序员啊,对不起。试试dtruss
。@一个随机的程序员啊,我多么讨厌现代的macOS。请参阅以了解如何使其工作。感谢您撰写此文章!是的,这是一个容易犯的错误。如果不打开文件进行写入,则不允许写入。