以空值终止的字符串,用于读取的打开文件

St.*_*rio 3 linux assembly x86-64 nasm

我正在尝试使用sys_open系统调用,我获取文件描述符以供阅读.这是我的计划:

SYS_exit equ 0x3C

SYS_open equ 0x02
O_RDONLY equ 0x00
O_WRONLY equ 0x01
O_RDWR equ 0x02

section .text
    global _start

_start:
    mov eax, SYS_open
    mov rdi, file_name
    mov rsi, O_RDONLY
    mov rdx, 0x00
    syscall

    mov eax, SYS_exit
    mov rdi, 0x00

    syscall

section .data
    file_name: db '/path/to/test\0'
Run Code Online (Sandbox Code Playgroud)

所以当我跑步时strace ./bin我得到了输出:

open("/path/to/test\\0", O_RDONLY) = -1 ENOENT (No such file or directory)
exit(0)   
Run Code Online (Sandbox Code Playgroud)

删除null-terminal后似乎工作正常:

open("/path/to/test", O_RDONLY) = 3
exit(0)                                 = ?
Run Code Online (Sandbox Code Playgroud)

我很好奇汇编程序如何知道我的字符串的长度.二进制文件中数据部分的内容如下:

Contents of section .data:
 6000d8 2f706174 682f746f 2f746573 74        /path/to/test
Run Code Online (Sandbox Code Playgroud)

我期望读取字符串直到达到空终止符.它是如何工作的?

眠りネ*_*ネロク 5

问题在于您定义以下数据的方式:

section .data
    file_name: db '/path/to/test\0'
Run Code Online (Sandbox Code Playgroud)

尾随NUL字符丢失,由于\0里面的字符串对应于该字符\0,应该代替定义为:

section .data
    file_name: db '/path/to/test', 0
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案.我对这个问题感到困惑,并且信任数据部分的OP转储,实际上它缺少`\`和`0`字符.:) (3认同)
  • NASM实际上可以翻译类似C的元字符串,如`\ 0`,但你必须将它们包含在反引号中.不知道如何在SO注释中格式化,所以我将尝试进行几次编辑:`db \`\ 0 \``应该在NASM中定义单个零字节.检查列表文件(`-l` nasm选项)以验证组装后的机器代码输出.使用引号和撇号,您必须是文字,并使用从答案定义零的方式.https://www.nasm.us/doc/nasmdoc3.html#section-3.4.2 (2认同)