2010-11-11 10 views
1

Ubuntu 10.10 64 bits. GNU comme.Erreur de segmentation avec cvtps2dq et cvttps2dq


.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 

Exécution des résultats du programme dans une erreur de segmentation:


~/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 $ 

drôle est, si je compilez le programme avec une seule de ces deux lignes (soit un):

cvtps2dq value1 , %xmm0 
cvttps2dq value1 , %xmm1 

ça fonctionne bien.

Des suggestions? A propos, cet exemple est basé sur celui du livre "Professional Assembly Language" de Richard Blum. Les exemples sont écrits pour Linux 32 bits et j'ai dû faire une conversion en conséquence. Alors peut-être que c'est une chose 32/64. :-)

Merci!

Ed

+0

Cela ne plante pas pour moi. Bien sûr, cela ne fait pas grand chose de visible. Vous pouvez simplifier votre lien à juste 'ld test.o -o test'. Attention à nommer les exécutables "test": il y a un/bin/test (sur Linux/usr/bin/test) qui finira par vous surprendre si votre propre programme porte le même nom. –

+0

Salut Ben. Si je construis via 'comme -64 test.s -o test.o && ld test.o -o test' alors ça marche. – dharmatech

+0

Cela fonctionne aussi: '--64 test.s -o test.o && ld test.o -o test -dynamic-lieur/lib64/ld-linux-x86-64.so.2'. – dharmatech

Répondre

0

vous ne spécifiez pas opérandes d'alignement et de la mémoire à SSE2 opcodes ont une exigence d'alignement de 16 octets. Cela pourrait être en train de te baiser. Pour GNU AS, essayez d'ajouter .align 4 avant value1: (dans GNU AS sur x86, "align 4" signifie "assurez-vous que les 4 derniers bits de l'adresse sont à zéro", pas "aligner l'adresse sur un multiple de 4").

En outre, quelle instruction obtenez-vous le segfault? Le problème réel pourrait être quelque chose sans rapport.

+0

Salut Fabian. Le '.align 4' ne semble pas faire la différence. – dharmatech

+0

Selon gdb, la segfault se produit à 'cvtps2dq value1,% xmm0'. – dharmatech

+3

@dharmatech: Essayez '.align 16' au lieu de' .align 4'. – user200783

Questions connexes