VC内嵌汇编使用SSE微指令的问题

Diab1o 2007-12-30 04:39:51
mulps xmm0, [edi]
这样的调用运行时出现
未处理的异常: 0xC0000005: 读取位置 0xffffffff 时发生访问冲突 。
这样的非法操作,edi保存的地址确认无误,究竟是什么问题,跪求解决方法,感恩!
...全文
216 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ollydbg23 2008-01-01
  • 打赏
  • 举报
回复
“使用SSE指令时,要操作的内存首地址必须16字节对齐,否则就会出错。
一般的汇编编译器如masm,nasm等可通过align 16来实现16字节对齐,对于VC6,可以通过__declspec(align(16))实现某变量的16字节对齐。对于动态分配的内存,默认8字节对齐,但可手工调整到16字节对齐。使用vertualalloc()这个win32API分配的内存是页对齐的,自然是16字节对齐。
当然,实现16字节对齐的方法还有很多。”

上面这位讲的实在太好了,我目前就遇到这样的问题。折腾了半天才解决的。
16直接对齐,这个很麻烦,我一开始装的是VC6集成sp6的企业版本,结果折腾了半天,__declspec(align(16))这个语句居然不认识,然后就是里面调试的时候,cpu的寄存器一律显示是0,写mmx指令也是白搭。。。最后实在太郁闷了,改装了intel的c++编译器,才把这个问题彻底解决掉,呵呵。
Diab1o 2008-01-01
  • 打赏
  • 举报
回复
问题已解决,感恩!
X_worm 2008-01-01
  • 打赏
  • 举报
回复
是VirtualAlloc()这个API函数
X_worm 2008-01-01
  • 打赏
  • 举报
回复
使用SSE指令时,要操作的内存首地址必须16字节对齐,否则就会出错。
一般的汇编编译器如masm,nasm等可通过align 16来实现16字节对齐,对于VC6,可以通过__declspec(align(16))实现某变量的16字节对齐。对于动态分配的内存,默认8字节对齐,但可手工调整到16字节对齐。使用vertualalloc()这个win32API分配的内存是页对齐的,自然是16字节对齐。
当然,实现16字节对齐的方法还有很多。
alan001 2007-12-31
  • 打赏
  • 举报
回复
up
Diab1o 2007-12-30
  • 打赏
  • 举报
回复
[edi]的内容应该没有问题,就是一个数组的指针,不用汇编时候完全正常,内存对齐是什么意思,要怎样做?
housisong 2007-12-30
  • 打赏
  • 举报
回复

[edi]的值正常吗? 内存对齐了吗?
大熊猫侯佩 2007-12-30
  • 打赏
  • 举报
回复
check edi value !
ollydbg23 2007-12-30
  • 打赏
  • 举报
回复
edi没有问题?
我虽然不是很懂mmx sse指令,但是觉得你是不是edi的指向内容出现问题了?

21,499

社区成员

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

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