返回信息流这个在vc6(sp5+pp5)下测试c++代码中内嵌汇编代码(_asm{}形式),
编译运行都正常。。
到了vs2005下面编译正常。。运行的时候就报错。。
这个难道和不同的编译环境有关系么。。
还是vs2005有些特别的设定呢?
先致谢。。
(额,不知道发这里是不是合适。。不过习惯了这里。。就这样吧)
这是一条镜像帖。来源:北邮人论坛 / cpp / #40130同步于 2010/6/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
c++内嵌汇编的问题
qiuyesuifeng
2010/6/3镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
【 在 qiuyesuifeng 的大作中提到: 】
: 这个在vc6(sp5+pp5)下测试c++代码中内嵌汇编代码(_asm{}形式),
: 编译运行都正常。。
: 到了vs2005下面编译正常。。运行的时候就报错。。
: ...................
注意在使用寄存器之前把相应的寄存器先压栈保存 然后使用完后再弹出 因为c编译器是无法知道你在汇编中使用了哪些寄存器 这就照成寄存器使用交叉 所以可能错误
【 在 jmpesp 的大作中提到: 】
:
: 【 在 qiuyesuifeng 的大作中提到: 】
: : 这个在vc6(sp5+pp5)下测试c++代码中内嵌汇编代码(_asm{}形式),
: ...................
恩,先多谢,这个我注意了。。而且我在vc下面已经运行处正确的结果了。。其实也就用了下sse。。但是同样的程序在vs2005下面编译通过。。运行出错。。不知道是什么原因。。
【 在 qiuyesuifeng 的大作中提到: 】
: 恩,先多谢,这个我注意了。。而且我在vc下面已经运行处正确的结果了。。其实也就用了下sse。。但是同样的程序在vs2005下面编译通过。。运行出错。。不知道是什么原因。。
代码发上来看看吧
【 在 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
跟了一下,似乎是对齐问题,对SSE指令无了解,随便说说
lea eax,a
lea ebx,b
lea ecx,c
movaps xmm0, [eax]
movaps xmm1, [ebx]
………………………………… 这个地方访问违规,变量B没有按QDWORD对齐?
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字节对齐
【 在 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把所有的寄存器先压栈再说