我是一名匯編新手,我有一個簡單的C程式,將一個字串列印到stdout。在匯編中,這被翻譯成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 ('
', stdout) != EOF)
result = MIN (INT_MAX, len 1)。
_IO_release_lock(stdout)。
return result;
}
我無法弄清楚為什么在模擬MIPS處理器上,動態指令的數量會發生變化,有時會隨著字串長度的增加而減少?
uj5u.com熱心網友回復:
正如評論中指出的,glibc _IO_sputn涉及到做strlen,和該大小的memcpy。
MIPS上的glibc strlen使用的是純C的bithack,每次檢查4個位元組。 (不像其他大多數 ISA 有手寫的 asm)。) 為什么glibc的strlen需要如此復雜才能快速運行?。 它相當不簡單,它的啟動策略取決于字串開始的對齊情況。
更重要的是,在一個字的第4個位元組與下一個字的第1個位元組之間尋找終止的0位元組可能也會花費較少的指令。 (對于 MIPS64 來說是第 8 個位元組和第 1 個位元組)。 所以這可能是你看到動態指令數的非單調性擴展的原因。
memcpy對于4(或8)位元組的倍數,它也將花費較少的指令,它通過分支來選擇策略,也許還有src和dst的對齊。 (MIPS32/64r6之前的MIPS并沒有保證有效的無對齊存盤)。) 因此,連續呼叫不涉及重繪 緩沖區的stdio函式,會導致stdout緩沖區的不同目標對齊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/320407.html
標籤:
