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 を a (および b、c、d、e、f の順番で) によって参照された値を保持する ECX と比較し、比較結果を EAX に保存してシフトすることです。すべての比較が 1 つの変数に格納されるように、EAX レジスタを左に移動します。6 つの比較がすべて処理された後、ECX からの値がメモリにコピーされます。
これが私がやったことです。私のプログラムは2倍速く実行できますが、取得した値はすべてゼロです。多分私は間違った方法でそれをしますか?
__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 */
);