在 x86 程序集中打开文件模式 Linux

Opening file modes in x86 assembly Linux

我正在从《从头开始编程》一书中学习 x86 汇编 Linux,目前我正在学习如何打开文件并读取或写入文件。我在打开文件的选项上遇到问题,我知道 0 是只读的,03101 是写和截断的,我在哪里可以获得所有打开选项的完整文档?

使用:Windows 子系统 我在 /usr/include/asm-generic/fcntl.h

中找到了 x86 asm linux 的正确文件

这与 WSL 无关,而与您选择在 WSL 中安装的 Linux 发行版有关。不同的发行版会把东西放在文件系统的不同地方。
locate '*fcntl*.h' 是找到合适的 headers 的好方法。

您始终可以编译包含记录的 headers 的 C 程序(这将引入“真实的”headers),并查看其 gcc -E -dM 宏定义.甚至

gcc -E -dM /usr/include/fcntl.h | | grep ' O_'

仅过滤 O_ 宏常量。 (我认为 fcntl.h 可能在平原 /usr/include 中,没有埋在某个地方,但也许这只是我的 Arch GNU/Linux 发行版保持简单。它保持 Linux-specific libc header类似于 /usr/include/asm/ 中的 <asm/unistd.h>,您可以在其中找到分别用于 32 位和 64 位索书号的 unistd_32.hunistd_64.h


或者编写执行 printf("%x, %x\n", O_CREAT, O_TRUNC) 或其他任何操作的代码来打印出您感兴趣的一些常量,无论它们来自 header。 (或者打印出它们的按位或,比如 O_CREAT|O_TRUNC)。

S_IRUSR这样的权限模式位常量是根据像__S_IREAD这样的其他常量定义的,所以这有点像老鼠窝;可能只是打印出来是个好主意。或者简单地以八进制写入权限位,如 mov edx, 0o666 (NASM) 或 mov 66, %edx (GAS)。 (让 umask 清除文件创建时的 write-for-other 位)。


可以在手册页中找到要查找的常量名称,open(2)