在linux程序集中打印一个未知长度的参数

时间:2016-04-01 16:40:30

标签: linux assembly

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

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

所以任何人都可以告诉我使用Linux程序集打印未知字符串长度的最简单方法。

1 个答案:

答案 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只有系统调用的包装器)。