将数据从内存(可以是任意长度)移动到 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[=26=]),我们得到它的起始地址,该地址存在于堆栈中。那么如何使命令行数据对齐到 16 个字节(ABCD[=26=]\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
完全无关紧要。
相关:。您没有对齐缓冲区,您只是检查 16 字节的加载不会跨入新页面(即 ptr & 4095 <= (4096-16)
)。
如果您不知道,您就不能安全地使用movdqu
并且不得不退回到另一种策略。 (就像一个 16 字节的加载加载页面的最后 16 个字节,并且可能从 db 0,1,2,3,4,...,-1,-1,-1
的滑动 window 中查找 pshufb
控制向量,这将打乱你的字节实际上想要 XMM 寄存器的底部)。
使用 SIMD 处理未对齐的隐式长度字符串通常很不方便,因为可安全读取内容的语义取决于一次查看一个字节。 (除了利用内存保护具有页面粒度这一事实)。
我对汇编知之甚少(NASM),我想使用SSE4.2 执行字符串操作(是否存在子字符串)。所以我了解了 PCMPESTRI、PCMPISTRM 是如何工作的。我被困在中间,即从内存到 xmm 寄存器的数据传输。基本上,我想通过命令行(例如:./a.out ABCD)获取输入并传输到 xmm1 寄存器。通过命令行获取的输入可以是任意长度的字符串,即(1 - 大于 16),命令行数据存储时附加 0(即 ABCD[=26=]),我们得到它的起始地址,该地址存在于堆栈中。那么如何使命令行数据对齐到 16 个字节(ABCD[=26=]\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
完全无关紧要。
相关:ptr & 4095 <= (4096-16)
)。
如果您不知道,您就不能安全地使用movdqu
并且不得不退回到另一种策略。 (就像一个 16 字节的加载加载页面的最后 16 个字节,并且可能从 db 0,1,2,3,4,...,-1,-1,-1
的滑动 window 中查找 pshufb
控制向量,这将打乱你的字节实际上想要 XMM 寄存器的底部)。
使用 SIMD 处理未对齐的隐式长度字符串通常很不方便,因为可安全读取内容的语义取决于一次查看一个字节。 (除了利用内存保护具有页面粒度这一事实)。