系统调用 OSX 创建文件 [打开]
syscall OSX create file [open]
我打算使用 Mac 系统调用(OS X 而不是现在的 bios)创建一个文件。一切都编译得很好,但是应该是创建文件 "fileName db "Teste.txt", 0xA, 0x0" 的结果没有实现,我不明白。你能帮帮我吗,我也post你用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
,所以你最终得到一个不平衡的堆栈。这导致 "segmentation faults".
如果要编写直接进行系统调用的汇编代码,请使用 Linux 虚拟机。
macOS系统调用接口不是一个publicAPI。此接口没有官方文档,它与 Linux 系统调用接口在许多重要方面有所不同。这使得初学者学习汇编成为一个糟糕的地方!
Linux 上还提供了更好的调试工具,例如 strace
,它可以让您查看应用程序进行的确切系统调用。
我打算使用 Mac 系统调用(OS X 而不是现在的 bios)创建一个文件。一切都编译得很好,但是应该是创建文件 "fileName db "Teste.txt", 0xA, 0x0" 的结果没有实现,我不明白。你能帮帮我吗,我也post你用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
,所以你最终得到一个不平衡的堆栈。这导致 "segmentation faults".
如果要编写直接进行系统调用的汇编代码,请使用 Linux 虚拟机。
macOS系统调用接口不是一个publicAPI。此接口没有官方文档,它与 Linux 系统调用接口在许多重要方面有所不同。这使得初学者学习汇编成为一个糟糕的地方!
Linux 上还提供了更好的调试工具,例如 strace
,它可以让您查看应用程序进行的确切系统调用。