【发布时间】:2021-10-31 21:26:42
【问题描述】:
我是汇编新手,有一个简单的 C 程序将字符串打印到标准输出。在汇编中,这转换为main 调用_IO_Puts。 _IO_puts 的实现如下:https://code.woboq.org/userspace/glibc/libio/ioputs.c.html 如下。
int
_IO_puts (const char *str)
{
int result = EOF;
size_t len = strlen (str);
_IO_acquire_lock (stdout);
if ((_IO_vtable_offset (stdout) != 0
|| _IO_fwide (stdout, -1) == -1)
&& _IO_sputn (stdout, str, len) == len
&& _IO_putc_unlocked ('\n', stdout) != EOF)
result = MIN (INT_MAX, len + 1);
_IO_release_lock (stdout);
return result;
}
我无法弄清楚为什么动态指令的数量会随着模拟 MIPS 处理器上字符串长度的增加而变化,有时还会减少?
【问题讨论】:
-
你需要深入挖掘,大概是
_IO_sputn。它可能正在循环您的字符串。stdout是行缓冲的,因此它首先存储您的字符串,并且仅当\n被putc添加时才输出它。这涉及到一个memcpy,它会随着你的字符串的长度而缩放。 -
它也在做
strlen(str)... -
哈哈是的好点:D
-
glibc strlen 在 MIPS 上使用纯 C bithack 一次检查 4 个字节。 (与大多数其他具有手写 asm 的 ISA 不同)。 Why does glibc's strlen need to be so complicated to run quickly?。这很不简单,但它的启动策略取决于一致性。