使用cvtps2dq和cvttps2dq进行分段错误

时间:2010-11-11 01:30:57

标签: assembly

Ubuntu 10.10 64位。 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

它运行良好。

有什么建议吗?

顺便说一下,这个例子是基于Richard Blum所着的“Professional Assembly Language”一书。这些示例是为32位Linux编写的,我不得不做一些相应的转换。所以也许它是一个32/64位的东西。 : - )

谢谢!

1 个答案:

答案 0 :(得分:0)

您没有指定SSE2操作码的对齐和内存操作数具有16字节对齐要求。那可能会搞砸你。对于GNU AS,尝试在.align 4之前添加value1:(在x86上的GNU AS中,“对齐4”表示“确保地址的底部4位为零”,而不是“将地址对齐到a多个4“)。

另外,你有什么指令可以获得段错误?实际问题可能与此无关。