Linux 程序集创建文件有名称大小限制吗?

Linux Assembly Creating File Has A Name Size Limit?

我正在尝试在 32 位程序集中创建一个文件,但是在创建文件时名称被限制为只有四个字符。我不确定为什么会这样。 这是我的代码;

.section .data

.equ SYS_WRITE, 4
.equ SYS_CREAT, 8
.equ SYS_OPEN, 5
.equ SYS_CLOSE, 6
.equ O_CREAT_WRONLY_TRUNC, 03101
.equ LINUX_SYSCALL, 0x80

name:
.ascii "t.txt[=11=]"

.section .text

.global _start 
_start:                 
movl %esp, %ebp
pushl name
movl $SYS_OPEN, %eax
movl %esp, %ebx
movl $O_CREAT_WRONLY_TRUNC, %ecx
movl 66, %edx
int $LINUX_SYSCALL


movl %eax, %esi
movl $SYS_CLOSE, %eax
movl %esi, %ebx
int $LINUX_SYSCALL

movl , %eax
int $LINUX_SYSCALL

并通过终端编译代码;

as --32 touchfile.s -o touchfile.o
ld touchfile.o -o touchfile -m elf_i386
./touchfile

the file name also has a weird binary symbol at the end.

however when the file is created the name is constrained to only four characters.

...如果你运气不好,第4个字母后甚至会有垃圾字符(例如"t.txDK@-_X="而不是"t.txt")。

您的代码只能正确处理最多 3 个字符的文件名(这意味着 4 个字符,包括终止 NUL)!

问题是以下顺序:

pushl name
...
movl %esp, %ebx

使用指令pushl name 将文件名的 4 个字节精确复制到堆栈。如果你的文件名较长,则不复制其余部分。

使用 movl %esp, %ebp 告诉 Linux 文件名位于堆栈上。

问题是:为什么要让文件名入栈?

如果你不坚持文件名在栈上,你可以删除指令pushl name,因为你不需要将文件名复制到栈上。

使用指令mov $name, %ebx(而不是mov %esp, %ebx)告诉Linux文件名位于地址name.