繁体   English   中英

syscall OSX创建文件[打开]

[英]syscall OSX create file [open]

我打算使用Mac系统调用(现在是OS X,而不是BIOS)来创建文件。 一切都编译良好,但是结果应该是创建文件“ fileName 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 )
 fileName db "Teste.txt", 0xA, 0x0 

包含换行代码0xA可以用于显示目的,但是对于打开它则不好! 算了吧:

fileName    db "Teste.txt", 0x0

 mov rbx, fileName push mode_f push FLAGS push rbx syscall 

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

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

 f_open_file: mov rbp, rsp push rbp 

要实际保留rbp您需要交换以下两条指令:

f_open_file:
    push rbp
    mov  rbp, rsp

为此,您还需要调整[rbp + ...]上使用的偏移量。


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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM