[英]Move data from memory(could be of any length) to XMM
我對匯編(NASM)知之甚少,我想使用 SSE4.2 執行字符串操作(是否存在子字符串)。 所以我了解了 PCMPESTRI、PCMPISTRM 的工作原理。 我被困在中間,即數據從內存傳輸到 xmm 寄存器。 基本上,我想通過命令行(例如:./a.out ABCD)獲取輸入並傳輸到 xmm1 寄存器。 通過命令行獲取輸入可以是任何長度的字符串,即(1 - 超過 16),並且命令行數據以 0 附加存儲(即 ABCD\\0),我們得到它存在於堆棧中的起始地址。 那么如何使命令行數據對齊到 16 個字節(ABCD\\0\\0\\0\\0...最多 16 個)?
此外,我不想使用 brk 系統調用分配內存並將所有命令行數據復制到它,然后傳輸到 xmm1 寄存器。(因為我想一次性完成子字符串檢查,而不是將所有數據移動到新分配的內存中然后復制每個內容......這可能會增加執行時間)
我試圖這樣做:-
section .data
align 16 ; I thought that command line data is stored in data section and may align to 16. :-(
...
section .bss
...
section .text
...
但它沒有用..那么我如何通過考慮輸入的長度可變(1 - 超過 16)來實現將數據傳輸到 xmm 寄存器
我應該使用哪個移動指令?
我應該如何解決這個數據移動,其中輸入來自命令行並且它可以是任何長度..?
我的 CPU 信息標志(/proc/cpuinfo)是:sse sse2 ssse2 sse4_1 sse4_2
命令行參數在堆棧中,而不是在.data
。 對齊.data
完全無關緊要。
相關: 在 x86 和 x64 上的同一頁面內讀取緩沖區的末尾是否安全? . 你不對齊你的緩沖區,你只是檢查一個 16 字節的加載不會進入一個新頁面(即ptr & 4095 <= (4096-16)
)。
如果你不知道這一點,你就不能安全地使用movdqu
而不得不退回到另一種策略。 (比如可能是一個 16 字節的負載,它加載頁面的最后 16 個字節,並且可能從db 0,1,2,3,4,...,-1,-1,-1
的滑動窗口中查找pshufb
控制向量db 0,1,2,3,4,...,-1,-1,-1
會將您實際想要的字節混洗到 XMM 寄存器的底部)。
使用 SIMD 處理未對齊的隱式長度字符串通常不方便,因為安全讀取的語義取決於一次查看一個字節。 (除了利用內存保護具有頁面粒度這一事實)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.