gpt4 book ai didi

linux - 如何在程序集中创建具有动态指定文件路径的文件?

转载 作者:行者123 更新时间:2023-12-03 09:55:20 24 4
gpt4 key购买 nike

这个问题主要是如何在汇编中处理路径名(任意长的字符串),而没有db或类似的任何帮助器。我已经看到了this这样的几个示例,该示例显示:

section .text
global _start ;must be declared for using gcc

_start: ;tell linker entry point
;create the file
mov eax, 8
mov ebx, file_name
mov ecx, 0777 ;read, write and execute by all
int 0x80 ;call kernel

section .data
file_name db 'myfile.txt'

但是,我特别想了解如何动态地执行此操作。我想(1)从汇编的 Angular 更好地理解文件名的要求(是否需要空终止符等),更重要的是(2)在不使用 db或任何汇编程序助手的情况下指定文件名。例如,您可以通过命令行指定文件名,而目标文件将不知道其结构。

你怎么做到这一点?

最佳答案

采用长度不为arg的const char*的系统调用始终采用C字符串:0终止的隐式长度

就像open(const char *path, int flags, int mode),与write(int fd, void *buf, size_t len)不同。

这就是为什么当从C调用像open("input.txt", O_RDONLY)open(argv[1], O_WRONLY|O_CREAT)时它们可以工作的原因。请记住,C字符串文字为您提供了一个指向带有char终止符的静态存储中0数组的指针。

BTW,NULL是指针常量。 NUL是ASCII '\0'。只需将它们称为“0终止”字符串即可。

所以是的,您应该在, 0的末尾使用db

命令行参数始终采用C字符串格式;这就是Unix如何跨系统调用/进程边界,以及ISO C标准库函数传递字符串数据。这包括所有路径名。

在Linux中,进入_start时,堆栈指针指向argc。上面是char *argv[]数组的元素。 (不是char **argv指针,只是堆栈中从ESP + 4到ESP + argc * 4的一组值数组。还以NULL指针(0)终止)。 i386和x86-64 System V ABI文档中对此进行了说明。

Linux Assembly x86_64 create a file using command line parameters显示了将argv[1]加载到系统调用的pathname arg中的示例。

Reading from a file in assembly是一个32位示例。

关于linux - 如何在程序集中创建具有动态指定文件路径的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62163490/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com