我在将 c++ 程序转换为程序集时遇到问题,我必须这样做
这是我的 C++ 代码
for(int i=0;i<rows-4;i++,a+=4,b+=4,c+=4,d+=4,e+=4,f+=4,x+=4,o+=4){
for(int j=0;j<cols-4;j++,a++,b++,c++,d++,e++,f++,x++,o++){
*o=*a>*x;
*o=*b>*x|(*o<<1);
*o=*c>*x|(*o<<1);
*o=*d>*x|(*o<<1);
*o=*e>*x|(*o<<1);
*o=*f>*x|(*o<<1);
}
}
o 是指向输出数据的指针,而 a,b,c,d,e,f 和 x 是指向输入数据的指针。我想要的只是将输入数据的比较结果保存到单个变量中,但是当正在处理的数据很大时,上面的代码效率不高。与将临时数据保存在寄存器中相比,程序需要更多时间将数据保存到内存中。
所以我想做的就是让这个过程在注册中完成。我尝试过的是我将 x 引用的数据存储在 EBX 中,将 EBX 与 ECX 进行比较,ECX 保存 a 引用的值(以及 b、c、d、e、f 顺序),将比较结果保存到 EAX 并移位将 EAX 寄存器向左,以便所有比较将存储在一个变量中。在已经处理完所有 6 个比较之后,来自 ECX 的值被复制到内存中。
这就是我所做的,我的程序运行速度可以快两倍,但我得到的所有值都为零。也许我做错了?
__asm__(
"xorl %%eax,%%eax;"
"xorl %%ebx,%%ebx;"
"xorl %%ecx,%%ecx;"
"movl %1, %%ebx;"
//start here
"movl %2,%%ecx;"
"cmp %%ebx,%%ecx;"
"jnz .one;"
"orl $0x1,%%eax;"
".one:;"
"shll $1,%%eax;"
"movl %3,%%ecx;"
"cmp %%ebx,%%ecx;"
"jnz .two;"
"orl $0x1,%%eax;"
".two:;"
"shll $1,%%eax;"
"movl %4,%%ecx;"
"cmp %%ebx,%%ecx;"
"jnz .three;"
"orl $0x1,%%eax;"
".three:;"
"shll $1,%%eax;"
"movl %5,%%ecx;"
"cmp %%ebx,%%ecx;"
"jnz .four;"
"orl $0x1,%%eax;"
".four:"
"shll $1,%%eax;"
"movl %6,%%ecx;"
"cmp %%ebx,%%ecx;"
"jnz .five;"
"orl $0x1,%%eax;"
".five:"
"shll $1,%%eax;"
"movl %7,%%ecx;"
"cmp %%ebx,%%ecx;"
"jnz .six;"
"orl $0x1,%%eax;"
".six:"
//output
"movl %%eax,%0;"
:"=r"(sett)
:"r"((int)*x),"r"((int)*a) ,"r"((int)*b) ,"r"((int)*c) ,"r"((int)*d),"r"((int)*e),"r"((int)*f) /* input */
);