簡體   English   中英

將數據從內存(可以是任意長度)移動到 XMM

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM