gpt4 book ai didi

linux - 在 Linux 程序集中打印未知长度的参数

转载 作者:太空宇宙 更新时间:2023-11-04 04:59:54 24 4
gpt4 key购买 nike

在Linux汇编中,我们可以使用系统调用write将字符串写入默认输出。但是这个系统调用需要字符串长度,但参数在所有执行中都没有固定长度。

所以,我知道我们可以通过浏览参数并查找空字节来计算参数的长度。尽管如此,我正在寻找一种更简单的方法来使用 Linux 程序集打印参数(或任何长度未知的字符串)。

谁能告诉我用 Linux 程序集打印未知字符串长度的最简单方法。

最佳答案

没有 Linux 系统调用将隐式长度字符串(C 风格以 null 结尾)写入文件描述符。所以你必须在进行系统调用之前自己计算出长度。

Linux 可以跨多种架构移植,因此我将用可移植汇编语言(又名 C:)来表达答案:

int write_implicit_length_string(const char *str) {
size_t size = strlen(str);
return write(1, str, size); // stdout is always fd 1
}

如果你想看asm,compile it with gcc (尽管这只会向您显示对 strlen 的函数调用。gcc -O3 不会在 x86 上内联 strlen 代码)。

就 strlen 的 asm 实现而言,对于 x86-64,最好的选择是使用 pcmpeqb/pmovmskb/test/jnz 来查找第一个零字节的 SSE2 循环。显然,每个 ISA 都有自己的执行方式,但重要的一点是内核无法为您执行此操作。

有一些 C 标准库函数可以将字符串打印到 stdio FILE *(例如 fputs),但不能打印到 unix 文件描述符(libc 只有系统调用的包装器)。

关于linux - 在 Linux 程序集中打印未知长度的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36361535/

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