【问题标题】:syscall OSX create file [open]系统调用 OSX 创建文件 [打开]
【发布时间】:2018-01-06 06:44:09
【问题描述】:

我打算使用 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 )

【问题讨论】:

  • 错误代码是什么?您是否尝试过使用系统调用跟踪器?
  • 我编译时没有出现错误代码:nasm -f macho64 c_file.asm -o file.o && ld file.o -o File && ./File 我使用了@Sep的解决方案罗兰的结果还是一样。当前目录下没有创建文件,我承认我迷路了;也许我写的“f_open_file”函数是完全错误的?
  • 查看答案编辑。你没有设置RAX

标签: macos assembly x86-64 system-calls


【解决方案1】:
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,因此您最终会得到一个不平衡的堆栈。这会导致“分段错误”。

【讨论】:

  • 真的谢谢你,我错过了我的函数的调用,当然,尽管创建了文件,我还是看到了错误,它一定是我利用得非常糟糕的返回码。 ->错误打开文件->分段错误:11
  • 如何利用返回码?您的程序永远不会到达 f_open_file,因为它上面有一个 syscall_exit
【解决方案2】:

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

macOS 系统调用接口不是公共 API。该接口没有官方文档,它与 Linux 系统调用接口在许多重要方面有所不同。这对于初学者学习汇编来说是一个糟糕的地方!

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

【讨论】:

  • 它存在适用于 Mac OS X 的 ABI 文档,但我承认这对于初学者来说并不明显developer.apple.com/library/content/documentation/…
  • @sambia39 系统调用接口(部分)记录在案,但系统调用本身没有。请注意,系统调用通常与 libc 包装器没有相同的接口。
  • FreebSD 文档适用于 MacOS 的 32 位和 64 位系统调用接口。只有一个问题,那就是在 MacOS 上,与 FreeBSD 对应的系统调用相比,64 位系统调用必须添加 0x2000000。系统调用接口是公开的,你只需要知道在哪里看。每个 OSX 都有一个头文件,其中也列出了它们。
  • 感谢您提供此信息。最后,我想我找到了我的错误。第一个是条件跳转而不是jge,而是jnle。我遇到的另一个困难是在start 中打开函数的返回码执行exit(1);,有点像return EXIT_FAILLURE。要说这个程序,就是用代码错误-1而不是错误信息来阻止:segmentation fault: 11
  • 您无法从start返回。 (这甚至不是特定于 macOS。)通常,运行时从 start 调用 main,然后在运行退出处理程序后使用返回代码调用 _exit
猜你喜欢
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
相关资源
最近更新 更多