#x86-64 #nasm #intel #sse
#x86-64 #nasm #intel #sse
Вопрос:
Я пытаюсь умножить два вектора значений с плавающей запятой в ассемблерном коде. Я использую препроцессор NASM на архитектуре Intel x86_64.
Недавно я узнал о расширении SSE для сборки Intel, поэтому я пытался реализовать упакованное умножение, используя инструкции SSE и хвостовую рекурсию. Вот моя функция:
mul:
movdqa xmm0, [rdi]
movdqa xmm1, [rsi]
mulps xmm0, xmm1
movdqa [rdi], xmm0
add rdi, 16
add rsi, 16
sub rdx, 4
cmp rdx, 0
jg mul
ret
Он умножает значение двух векторов на значение и сохраняет результаты в первый вектор. Указатели на векторы хранятся в rdi
и rsi
соответственно регистрируются, размер обоих должен быть записан rdx
.
Программа, написанная выше, обнаруживает ошибку сегментации во второй инструкции. Я думаю, что я неправильно использую SSE.
Есть ли другой способ использовать упакованное умножение? Или я просто делаю что-то не так?
Комментарии:
1. Пожалуйста, опубликуйте минимальный, воспроизводимый пример, в частности код, который вызывает
mul
.2. Если
movdqa xmm1, [rsi]
segfaults,[rsi]
вероятно, не выровнен по 16 байтам. Просто используйтеmovups
вместо этого.3. Используйте отладчик для просмотра значения указателя, особенно RSI. Это покажет вам, произошла ли ошибка из-за misalignmnet.