在linux程序集中,我们可以使用系统调用write
将字符串写入默认输出。但是这个系统调用需要字符串长度,但是参数在所有执行中没有固定的长度。
所以,我知道我们可以通过浏览它并查找空字节来计算参数的长度。虽然,我正在寻找一种更简单的方法来打印Linux程序集的参数(或任何长度未知的字符串)。
所以任何人都可以告诉我使用Linux程序集打印未知字符串长度的最简单方法。
答案 0 :(得分:1)
没有Linux系统调用将隐式长度字符串(C样式的空终止)写入文件描述符。因此,在进行系统调用之前,您必须自己计算长度。
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只有系统调用的包装器)。