Как я могу умножить два вектора в сборке NASM x86?

#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.