关于sse的一个问题。

抬头看路 2001-11-27 01:54:27
我用masm32写了一个函数,用到了sse,在bcb中使用,有时没有问题,有时在第二次用的时候会发生异常Privileged instruction。在这个函数中我只使用了esp,eax,ecx,edx,xmm0,xmm1,xmm2,xmm3。是不是哪个寄存器的值需要保护?
环境:Win2000 pro 2195 + sp2
bcb5 + sp1
masm32 6.14
...全文
174 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
抬头看路 2001-12-07
  • 打赏
  • 举报
回复
我不知道athlon xp实现sse和intel实现的sse有不同,否则sse的程序不能在xp上正常运行
lhztco99 2001-12-07
  • 打赏
  • 举报
回复
64]
AMD 的网站上说:
52 SSE instructions with SIMD integer and floating point additions offer excellent compatibility with Intel’s SSE technology

请注意数字 52 SSE instructions with SIMD integer and floating point additions
可是 Intel 体系还有8条Cache和存贮控制指令和4条状态控制指令共64条,不知道AMD实现没?

你试试这些:

Movntq [EDI],MM0

Prefectchnta [ESI]

等等,看看XP上正常否?只是试试看,能通过也好,不行也好,只是试试看..

lhztco99 2001-12-06
  • 打赏
  • 举报
回复
还有, 你说有时侯会出错,有时候不会,那么绝对不是语法问题。而是你的
数据存放地址每次运行都是不同的(这就不用我说了)。有时凑巧对齐了128bit,
执行 movaps 就没问题,有时候没对齐,用movaps 就保证出错。呵呵,如果不是
这个问题,我马上回家抱孩子去。你这态度实在是不怎么地。好心帮你解决问题,
一句话: 过河XX 。 算了,懒的和你一般计较。
lhztco99 2001-12-06
  • 打赏
  • 举报
回复
to whyjld(白痴) :

老大啊,你懂不懂啊,在SSE里可没有 128bit 的整数类型啊,在SSE2里才出现的。
在SSE里,XMM0-XMM7就是128bit浮点寄存器。
而且就算在SSE2里,128bit整数和128bit浮点是共用的寄存器,都是XMM0-XMM7,
并且你赋值的一句:
movaps xmm0, [ecx]; 中
movaps = Move Aligned Packed Single 居然说不是浮点数,

大概你是想加快强制加快装入数据的过程吧?傻,用XMM取数据比MM要慢的多,哈哈。
抬头看路 2001-12-06
  • 打赏
  • 举报
回复
xmm不是浮点寄存器,我没用emms已经解决
lhztco99 2001-12-06
  • 打赏
  • 举报
回复
首先:你的CPU是 速龙 XP 吗?因为只有XP才部分支持SSE指令,我以为你用的Intel体系。
其次:如果说是这样,是我误会你了。Sorry !!!
再次:我说SSE中XMM是浮点寄存器并不说XMM和原浮点寄存器共用,而是说XMM保存的是Single浮点数。
最后: 我觉得你比较小气,我也是。

抬头看路 2001-12-06
  • 打赏
  • 举报
回复
lhztco99(环保概念股)
首先,谢谢你的热情。很希望有机会和你更多的讨论问题,我周围愿意搞这个的很少。我的qq:121145789,email whyjld@sina.com
其次,指出你的一个错误,xmm0-7是新加入的寄存器,所以需要os的支持在进程切换的时候保存现场,但是3dnow就不需要os特别的支持,他使用的是mm0-7,和mmx是一样的,而mmx的mm0-7是x86的80位浮点寄存器的别名,所以才需要在用mmx指令的时候用emms在浮点状态和mmx状态之间切换,而sse不需要,他用的寄存器和浮点寄存器没什么关系。我的程序现在就是这样,我对齐后已经没有问题,原来是因为bcb中对齐指令没起作用,是8字节对齐的所以会出问题。而且我现在的程序中sse和浮点指令是交错使用的(为了比较sse和浮点指令计算结果的差异),没用emms没有任何问题。
再次,在这方面我的确是刚开始学,但是你说的我还都懂,所以请你以后指责别人前保证自己的观点是正确的。
最后,2001-12-4 17:31我已经发信给斑竹要求将这个帖子删除,因为我已经解决问题,不知道为什么帖子还在。
lhztco99 2001-12-05
  • 打赏
  • 举报
回复
哦 movaps 要求内存地址对齐128bit边界,就是你的ecx要是16的倍数才行啊。
我看你还是用不要求对齐的movups好了,比较保险.速度也差不多了。

另,emms在PIII上一定要用,你只要写了 MM0-MM7 和 XMM0-XMM7 就实际上改写了
浮点寄存器状态,所以要用。P4 可以不用。
lhztco99 2001-12-03
  • 打赏
  • 举报
回复
还有啊 esp好象要保护的哦
lhztco99 2001-12-03
  • 打赏
  • 举报
回复
忘记emms了吧!
抬头看路 2001-12-03
  • 打赏
  • 举报
回复
开始部分是这样的
retaddress = 0
dst = retaddress+4
m1 = dst+4
m2 = m1+4
mov ecx, [esp+m1];第一个数组
mov edx, [esp+m2];第二个数组
mov eax, [esp+dst];目标数组
一般第二次调用这个函数到下面这一句就出问题了。
movaps xmm0, [ecx];读入第一个数组
抬头看路 2001-12-03
  • 打赏
  • 举报
回复
esp我保护了也不行。
sse不使用浮点寄存器,应该不用emms吧
抬头看路 2001-11-30
  • 打赏
  • 举报
回复
请多帮忙
yoboo_yb 2001-11-29
  • 打赏
  • 举报
回复
关注!

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧