BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #40130同步于 2010/6/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

c++内嵌汇编的问题

qiuyesuifeng
2010/6/3镜像同步7 回复
这个在vc6(sp5+pp5)下测试c++代码中内嵌汇编代码(_asm{}形式), 编译运行都正常。。 到了vs2005下面编译正常。。运行的时候就报错。。 这个难道和不同的编译环境有关系么。。 还是vs2005有些特别的设定呢? 先致谢。。 (额,不知道发这里是不是合适。。不过习惯了这里。。就这样吧)
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
jmpesp机器人#1 · 2010/6/3
【 在 qiuyesuifeng 的大作中提到: 】 : 这个在vc6(sp5+pp5)下测试c++代码中内嵌汇编代码(_asm{}形式), : 编译运行都正常。。 : 到了vs2005下面编译正常。。运行的时候就报错。。 : ................... 注意在使用寄存器之前把相应的寄存器先压栈保存 然后使用完后再弹出 因为c编译器是无法知道你在汇编中使用了哪些寄存器 这就照成寄存器使用交叉 所以可能错误
qiuyesuifeng机器人#2 · 2010/6/4
【 在 jmpesp 的大作中提到: 】 : : 【 在 qiuyesuifeng 的大作中提到: 】 : : 这个在vc6(sp5+pp5)下测试c++代码中内嵌汇编代码(_asm{}形式), : ................... 恩,先多谢,这个我注意了。。而且我在vc下面已经运行处正确的结果了。。其实也就用了下sse。。但是同样的程序在vs2005下面编译通过。。运行出错。。不知道是什么原因。。
jmpesp机器人#3 · 2010/6/4
【 在 qiuyesuifeng 的大作中提到: 】 : 恩,先多谢,这个我注意了。。而且我在vc下面已经运行处正确的结果了。。其实也就用了下sse。。但是同样的程序在vs2005下面编译通过。。运行出错。。不知道是什么原因。。 代码发上来看看吧
qiuyesuifeng机器人#4 · 2010/6/4
【 在 jmpesp 的大作中提到: 】 : : 【 在 qiuyesuifeng 的大作中提到: 】 : : 恩,先多谢,这个我注意了。。而且我在vc下面已经运行处正确的结果了。。其实也就用了下sse。。但是同样的程序在vs2005下面编译通过。。运行出错。。不知道是什么原因。。 : ................... int main(int argc, char* argv[]) { short a[8] = {10,10,10,10,10,10,10,10}; short b[8] = {10,20,30,40,50,60,70,80}; short c[8] = { 0,0,0,0,0,0,0,0}; __asm { pushf lea eax,a lea ebx,b lea ecx,c movaps xmm0, [eax] movaps xmm1, [ebx] punpcklwd xmm1, xmm1 punpckldq xmm1, xmm1 paddw xmm0,xmm1 movaps [ecx],xmm0 popf } for (int i=0;i<8;i++) { printf("%d\n",c[i]); } return 0; } //因为只是在调试下检测了下寄存器的值,顺便看下sse一些命令到底怎么工作的。。所以程序没实现什么具体功能。。only a test:) // to jmpesp: thankY,gl
ZenZero机器人#5 · 2010/6/4
跟了一下,似乎是对齐问题,对SSE指令无了解,随便说说 lea eax,a lea ebx,b lea ecx,c movaps xmm0, [eax] movaps xmm1, [ebx] ………………………………… 这个地方访问违规,变量B没有按QDWORD对齐?
jmpesp机器人#6 · 2010/6/4
short __declspec(align(16)) a[8] = {10,10,10,10,10,10,10,10}; short __declspec(align(16)) b[8] = {10,20,30,40,50,60,70,80}; short __declspec(align(16)) c[8] = { 0,0,0,0,0,0,0,0}; SSE指令需要16字节对齐
jmpesp机器人#7 · 2010/6/4
【 在 qiuyesuifeng 的大作中提到: 】 : int main(int argc, char* argv[]) : { : short a[8] = {10,10,10,10,10,10,10,10}; : ................... 给你改了下 有以下两点错误: #include <stdio.h> int main(int argc, char* argv[]) { short __declspec(align(16)) a[8] = {10,10,10,10,10,10,10,10}; short __declspec(align(16)) b[8] = {10,20,30,40,50,60,70,80}; short __declspec(align(16)) c[8] = { 0,0,0,0,0,0,0,0}; __asm { pushf pushad lea eax,a lea ebx,b lea ecx,c movaps xmm0, [eax] movaps xmm1, [ebx] punpcklwd xmm1, xmm1 punpckldq xmm1, xmm1 paddw xmm0,xmm1 movaps [ecx],xmm0 popad popf } for (int i=0;i<8;i++) { printf("%d\n",c[i]); } return 0; } 第一 SSE指令必须16字节对齐 第二 在使用寄存器之前需要先压栈保存 你在使用eax ebx ecx的时候并没进行保存 这样很可能出错 (你这个程序的话那就一定会出现异常)因为c编译器不知道你在汇编中使用了哪些寄存器 所以用一条pushad把所有的寄存器先压栈再说