Ошибка сегментации с использованием cvtps2dq и cvttps2dq - PullRequest
1 голос
/ 11 ноября 2010

Ubuntu 10.10 64-bit.GNU as.


.section .data

value1:

    .float 1.25 , 124.79 , 200.0 , -312.5

.section .text

.globl _start

_start:

    nop

    cvtps2dq  value1 , %xmm0
    cvttps2dq value1 , %xmm1

    movl $1 , %eax
    movl $0 , %ebx
    int $0x80

Запуск программы приводит к ошибке сегментации:


~/scratch $ as --64 test.s -o test.o && ld test.o -o test -dynamic-linker /lib64/ld-linux-x86-64.so.2 -lc
~/scratch $ ./test
Segmentation fault
~/scratch $ 

Забавно, если я скомпилирую программу только с одной из этих двух строк (любой):

cvtps2dq  value1 , %xmm0
cvttps2dq value1 , %xmm1

работает нормально.

Есть какие-нибудь предложения?

Кстати, этот пример основан на одном из книги Ричарда Блума "Язык профессиональной сборки",Примеры написаны для 32-битного Linux, и мне пришлось соответственно преобразовать его.Так что, возможно, это 32/64 битная вещь.: -)

Спасибо!

Ред

1 Ответ

0 голосов
/ 11 ноября 2010

Вы не указываете выравнивание и операнды памяти для кодов операций SSE2 имеют требование выравнивания 16 байтов.Это может быть пьяным.Для GNU AS попробуйте добавить .align 4 перед value1: (в GNU AS на x86 «выровнять 4» означает «убедиться, что младшие 4 бита адреса равны нулю», а не «выровнять адрес по кратному 4»).).

Кроме того, по какой инструкции вы получаете segfault?Фактическая проблема может быть чем-то не связанным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...