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位的东西。 : - )
谢谢!
版
答案 0 :(得分:0)
您没有指定SSE2操作码的对齐和内存操作数具有16字节对齐要求。那可能会搞砸你。对于GNU AS,尝试在.align 4
之前添加value1:
(在x86上的GNU AS中,“对齐4”表示“确保地址的底部4位为零”,而不是“将地址对齐到a多个4“)。
另外,你有什么指令可以获得段错误?实际问题可能与此无关。