macos - 在程序集中获取系统调用的返回值
问题描述
我正在 Darwin x86_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
然而两者都不起作用。
解决方案
我找到了答案:
我发现使用创建模式和写入模式打开文件是可行的。
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 中)或or
(在汇编中)。
推荐阅读
- ruby-on-rails - 使用 docker 和 nginx 部署时 ActiveStorage image_tag 主机名错误
- asp.net-mvc - 从使用 Summernote 存储的数据库中检索数据时的问题意味着在 SQL Server 中以 HTML 格式存储
- vue.js - Vue Router - 使用 Vue 2 Composition API 获取路由参数
- ruby-on-rails - 创建 Factorybot 以返回包括关联实例的实例
- php - 我的 WooCommerce PHP 代码片段排除产品 ID 不起作用 - 请帮助我
- angular - Firebase 托管重定向附加应用路由重定向
- sql-server - SQL Server 2012 - 我尝试使用 2 列数据透视,但 SUM 函数没有给出预期结果
- roslyn-code-analysis - 是否可以仅为某些文件夹/文件(不是整个项目)启用 Roslyn 代码分析器?
- javascript - 在 React 中注册用户
- python - pd.info() 有 184 列