0

私はいくつかのインライン アセンブリ コードを実行しようとしています。

私の機能は

void pixemcpy(unsigned char *im_src, unsigned char *im_dest, int npix)
{
    int i;
    for(i=0;i<npix;i++) *im_dest++=*im_src++;
}

私のアセンブリインライン関数は

void inline_pixelcpy(unsigned char *im_src, unsigned char *im_dest, int npix){
    __asm__ volatile(
    "0: \n"
    "ldrb r3, [%[src]], #1 \n"
    "strb r3, [%[dst]], #1 \n"
    "subs %[iter], %[iter], #1\n"
    "bgt 0b\n"
    :
    : [src] "r" (im_src), [dst] "r" (im_dest), [iter] "r" (npix)
    : "cc", "r3"
    );
}

両方の関数が同じ c ファイルにあります。私のcファイルをコンパイルすると、それはうまくいきます!どちらの機能も同じことを行いますが、問題はありません。

-O2 または -O3 gcc オプションを使用すると、アセンブリ関数を返す (呼び出していない) ときにセグメンテーション違反が発生します。

私の2つの関数が別々のファイルにある場合、この問題は発生しません!

インライン コードに問題がありますか。インライン コードを最適化しようとしないように gcc に指示するにはどうすればよいでしょうか。

ありがとうエティエンヌ

4

0 に答える 0