Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.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 系统调用OSX创建文件[打开]_Macos_Assembly_X86 64_System Calls - Fatal编程技术网

Macos 系统调用OSX创建文件[打开]

Macos 系统调用OSX创建文件[打开],macos,assembly,x86-64,system-calls,Macos,Assembly,X86 64,System Calls,我打算使用Mac系统调用创建一个文件(OS X,目前不使用bios)。一切都编译得很好,但是创建文件名db“Teste.txt”,0xA,0x0“的结果应该是没有实现,我不理解。你能帮我一下吗,我还向你发布了用nasm编译的源代码 提前感谢您的回答 ;------------------------------------------------------------------------------ ; TITLE: SOURCE.ASM ;-----------------------

我打算使用Mac系统调用创建一个文件(OS X,目前不使用bios)。一切都编译得很好,但是创建文件名db“Teste.txt”,0xA,0x0“的结果应该是没有实现,我不理解。你能帮我一下吗,我还向你发布了用nasm编译的源代码 提前感谢您的回答


;------------------------------------------------------------------------------
; TITLE: SOURCE.ASM
;------------------------------------------------------------------------------

bits 64

;------------------------------------------------------------------------------
;   Definition des syscall
;------------------------------------------------------------------------------
%define _stdout         0x1
%define _stderr         0x2

%define O_RDONLY        0x0000          ; open for reading only
%define O_WRONLY        0x0001          ; open for writing only
%define O_RDWR          0x0002          ; open for reading and writing
%define O_ACCMODE       0x0003          ; mask for above modes
%define O_CREAT         0x0200          ; create if nonexistant 
%define O_TRUNC         0x0400          ; truncate to zero length 
%define O_EXCL          0x0800          ; error if already exists

%define syscall_write   0x2000004
%define syscall_exit    0x2000001
%define syscall_open    0x2000005
%define syscall_close   0x2000006

;------------------------------------------------------------------------------
;   Section code
;------------------------------------------------------------------------------
section .text

global start

start:

    xor rax, rax
    xor rbx, rbx
    mov rbx, fileName
    push mode_f
    push FLAGS
    push rbx
    syscall
    pop rax

    xor rbx, rbx
    mov rbx, rax
    mov rax, syscall_exit
    mov rdi, rbx
    syscall


f_open_file:
    mov rbp, rsp
    push rbp
    xor rax, rax
    mov rax, syscall_open
    mov rdi, [rbp+8]
    mov rsi, [rbp+16]
    mov rdx, [rbp+24]
    syscall
    pop rax

    if: cmp rax, -1
        jge else
        mov rbx, rax
        mov rax, syscall_close
        mov rdi, rbx
        syscall
        pop rax
        ret
    else:
        xor rbx, rbx
        mov rbx, MsgErrr
        push size_err
        push rbx
        call f_print_data
        xor rax, rax
        mov rax, -1
        ret

f_print_data:
    mov rbp, rsp
    push rbp
    mov rax, syscall_write
    mov rdi, _stdout
    mov rsi, [rbp+8]
    mov rdx, [rbp+16]
    syscall
    xor rax, rax
    ret


;------------------------------------------------------------------------------
;   Section Data
;------------------------------------------------------------------------------

section .data
    fileName    db "Teste.txt", 0xA, 0x0
    MsgErrr     db "Erreur open File", 0xA, 0x0
    size_file   equ ($-fileName)
    size_err    equ ($-MsgErrr)
    mode_f      equ 0777
    FLAGS       equ 0xA02 ;( O_RDWR| O_CREAT| O_EXCL )
包含换行代码
0xA
对于显示目的来说是好的,但是对于打开它是不好的!放下它:

fileName    db "Teste.txt", 0x0

您的代码缺少用于创建文件的open命令

mov rbx, fileName
push mode_f
push FLAGS
push rbx
mov  rax, syscall_open
syscall

要实际保留
rbp
,您需要交换这两条指令:

f_open_file:
    push rbp
    mov  rbp, rsp
在执行此操作时,您还需要调整
[rbp+…]
上使用的偏移量



您的所有子例程都忘记了弹出rbp,因此最终导致堆栈不平衡。这会导致“分段错误”。

如果您想编写进行直接系统调用的汇编代码,请使用Linux虚拟机

macOS系统调用接口不是公共API。该接口没有官方文档,它与Linux系统调用接口在许多重要方面有所不同。这使得它成为初学者学习汇编的一个可怕的地方


Linux上也有更好的调试工具,例如
strace
,可以让您查看应用程序正在进行的确切系统调用。

错误代码是什么?你试过使用系统调用跟踪程序吗?我没有编译时出现的错误代码:nasm-f macho64 c_file.asm-o file.o&&ld file.o-o file&&./file我使用了@Sep Roland的解决方案,结果保持不变。在当前目录中没有创建任何文件,我承认我是一个迷失的人;也许我写的“f_open_file”函数完全错了?请参见答案中的编辑。您没有设置
RAX
。非常感谢,我错过了函数的调用,当然,尽管创建了文件,但仍然出现了错误。这一定是我利用得非常糟糕的返回代码。->Erreur open File->Segmentation fault:11您如何利用返回代码?你的程序永远不会到达f_open_文件,因为它上面有一个syscall_出口!它存在适用于Mac OS X的ABI文档,但我承认对于初学者@sambia39来说并不明显系统调用接口(部分)有文档记录,但系统调用本身没有。请注意,系统调用通常没有与libc包装器相同的接口。FreebSD文档适用于MacOS的32位和64位系统调用接口。只有一个缺点,那就是在MacOS上,与FreeBSD对应项相比,64位系统调用必须添加0x2000000。系统调用接口是公共的,您只需要知道在哪里可以找到。每个OSX都有一个头文件,其中也列出了它们。感谢您提供这些信息。最后,我想我找到了我的错误。第一个是条件跳转,而不是
jge
,它应该是
jnle
。我遇到的另一个困难是在
start
中向上移动open函数的返回码以执行
退出(1)有点像
返回退出\u FAILLURE
。要说该程序停止,它将使用一个代码错误-1而不是错误消息:segmentation fault:11您无法从
start
返回。(这甚至不特定于macOS。)通常,运行时从
start
调用
main
,然后在退出处理程序中运行后使用返回代码调用
\u exit
mov rbx, fileName
push mode_f
push FLAGS
push rbx
mov  rax, syscall_open
syscall
f_open_file:
    mov rbp, rsp
    push rbp
f_open_file:
    push rbp
    mov  rbp, rsp