Mac 64位x86_64架构下nasm汇编关闭文件的问题及解决方案
Mac 64位环境NASM汇编实现文件关闭功能问题解决
我在Mac 64位系统下使用NASM汇编实现关闭文件功能时遇到问题,目标是创建文件并写入内容,已确认打开文件的操作逻辑正确,需要执行关闭文件操作才能让创建的文件实际生成,初始代码如下:
global start ; default rel section .text start: ;open mov rax, 0x2000005 mov rdi, file mov rsi, 1 syscall ;close mov rax, 0x2000006 mov rdi, file ; 此处需要替换正确的入参 syscall mov rax, 0x2000001 ; 退出程序 xor rdi, rdi syscall section .data str: db "Hello world", 0 strlen: equ $ - str file: db "test.txt" lenfile: equ $ - file
问题核心
MacOS属于BSD衍生系统,系统调用的返回值默认存在rax寄存器中,open系统调用执行成功后,rax中存储的就是对应文件的文件句柄,关闭文件时需要传入这个句柄,而非文件名指针。
修正方案
基础修正版本
;close mov rdi, rax ; 前面open调用的返回值存在rax中,就是目标文件句柄,在rax被覆盖前先转移到rdi mov rax, 0x2000006 syscall
优化可用版本
;close mov rdi, rax ; 前面open调用的返回值存在rax中,就是目标文件句柄,在rax被覆盖前先转移到rdi mov rax, 0x2000006 mov rsi, 0x0201 syscall
额外注意事项
最终排查发现如果仅传入文件名仍无法正常生成文件,需要将file对应的字符串修改为目标文件的完整绝对路径,优化版本的代码配合完整路径即可正常运行。
内容的提问来源于stack exchange,提问作者Yoffdan
相关产品推荐
相关产品推荐

