zmeykas
@zmeykas
Developer at SoftCommerce Ukraine

Как исправить SIGSEGV при вызове MOVDQA?

Гугл говорит, что это, скорее всего, ошибка выравнивания стека, поскольку инструкции SSE требуют выравнивания до 16 байт. Если так, то в каком месте мне еще нужно вызывать выравнивание? Ведь предыдущие инструкции MOVDQA выполняются без ошибок.

Фрагмент кода, вызывающий ошибку сегментации.
.p2align 6
        movdqa	64(%rsp), %xmm0
        movdqa	80(%rsp), %xmm1
        movdqa	96(%rsp), %xmm2
        movdqa	112(%rsp), %xmm3
        movdqa	128+64(%rsp), %xmm8
        movdqa	128+80(%rsp), %xmm9
        movdqa	128+96(%rsp), %xmm10
        movdqa	128+112(%rsp), %xmm11
        movdqa	256+64(%rsp), %xmm12
        movdqa	256+80(%rsp), %xmm13
        movdqa	256+96(%rsp), %xmm14
        movdqa	256+112(%rsp), %xmm15

        movq	%rsi, %rbx
        leaq	3*131072(%rsi), %rax

        movdqa	%xmm0, 64(%rbx)  #sigsegv received
        movdqa	%xmm1, 80(%rbx)
  • Вопрос задан
  • 2672 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
скорее всего, ошибка выравнивания стека

Ошибка выравнивания аргумента movdqa, не обязательно это стек.
Если так, то в каком месте мне еще нужно вызывать выравнивание?

@zmeykas а в каком вы уже его вызвали? Выровнен должен быть стек, а не код.
Сформировать выровненный по 16 байт кадр стека можно, например, так:
my_asm_function:
        pushq   %rbp
        movq    %rsp, %rbp
        subq    $512, %rsp    # минимальный размер кадра -- 512 байт
        andq    $-16, %rsp    # выравнивание по 16 байт
...
        popq   %rbp
        ret


Но у вас rbx не выравнен, а он берётся из второго аргумента функции. Равняйте его. Ну или не используйте movdqa, а используйте movdqu
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы