Переместить данные из памяти (может быть любой длины) в XMM - PullRequest
0 голосов
/ 09 марта 2020

Я мало знаю о сборке (NASM), я хотел выполнить строковую операцию (присутствует подстрока или нет) с использованием SSE4.2. Итак, я узнал, как работает PCMPESTRI, PCMPISTRM. Я застрял в середине, т.е. передача данных из памяти в регистр xmm. По сути, я хотел получить ввод через командную строку (например: ./a.out ABCD) и передать в регистр xmm1. Взятие ввода через командную строку может иметь любую длину строки, т. Е. (1 - более 16), а данные командной строки хранятся с добавлением 0 (т. Е. ABCD \ 0), и мы получаем его начальный адрес, который присутствует в стеке. Так как же сделать так, чтобы данные командной строки были выровнены с 16 байтами (ABCD \ 0 \ 0 \ 0 \ 0 ... до 16)?

Также я не хочу выделять память с помощью системного вызова и копирования brk все данные командной строки к нему и затем передать в регистр xmm1. (Поскольку я хотел выполнить проверку подстроки всего за один go вместо перемещения всех данных во вновь выделенную память и затем скопировать каждое содержимое ...., что может увеличить выполнение время)

Я пытался сделать это: -

section .data
align 16 ; I thought that command line data is stored in data section and may align to 16. :-(
 ...

section .bss
...
section .text
...

Но это не сработало .. Так как мне добиться передачи данных в регистр xmm, учитывая, что ввод может быть переменной длины (1 - более 16)

какую инструкцию перемещения я должен использовать?

Как мне решить это движение данных, когда ввод будет из командной строки и может иметь любую длину. .?

Мои информационные флаги ЦП (/ proc / cpuinfo): sse sse2 ssse2 sse4_1 sse4_2

1 Ответ

3 голосов
/ 09 марта 2020

Аргументы командной строки находятся в стеке, а не в .data. Выравнивание .data совершенно не имеет значения.

Связано: Безопасно ли читать после конца буфера в пределах одной и той же страницы на x86 и x64? . Вы не выравниваете свой буфер, вы просто проверяете, что 16-байтовая загрузка не переходит на новую страницу (т. Е. ptr & 4095 <= (4096-16)).

Если вы не знайте, что вы не можете безопасно использовать movdqu и вынуждены использовать другую стратегию. (Как, например, 16-байтовая загрузка, которая загружает последние 16 байт страницы и, возможно, ищет управляющий вектор pshufb из скользящего окна db 0,1,2,3,4,...,-1,-1,-1, которое перетасует нужные вам байты в конец XMM register).

Обработка невыровненных строк неявной длины с SIMD обычно неудобна, потому что семантика того, что безопасно читать, зависит от просмотра одного байта за раз. (За исключением использования того факта, что защита памяти имеет гранулярность страницы).

...