3

コード:

extern inline int strncmp(const char * cs, const char * ct, int count)
{
register int __res;
__asm__("cld\n"
"1:\tdecl %3\n\t"
"js 2f\n\t"
"lodsb\n\t"
"scasb\n\t"
"jne 3f\n\t"
"testb %%al, %%al\n\t"
"jne 1b\n"
"2:\txorl %%eax,%%eax\n\t"
"jmp 4f\n"
"3:\tmovl $1,%%eax\n\t"
"j1 4f\n\t"
"negl %%eax\n"
"4:"
:"=a" (__res):"D" (cs), "S" (ct), "c" (count):"si","di","cx");
return __res;
}

" js 2f\n\t "のfと" jne 1b\n " のbがわかりません。どうすればわかりますか? どの本を見るべきですか?ありがとうございました。

4

2 に答える 2

9

この文脈でfは、前方をb意味し、後方を意味します。つまり、記号が設定されている場合は、ラベル2にジャンプすることをjs 2f意味します。

あなたは調べたいと思うでしょうgcc inline assembly。このビットを含めるためのリファレンスをオンラインで見つけることができないようですが、ProfessionalAssemblyLanguageで見つけることができます。

名前付きラベルを使用できないのはなぜですか?本から引用するには:

Cコードに別のasmセクションがある場合、同じラベルを再度使用することはできません。そうしないと、ラベルの重複使用によりエラーメッセージが表示されます。

では、何ができるでしょうか。

解決策は、ローカルラベルを使用することです。条件付き分岐と無条件分岐の両方で、数値をラベルとして指定し、方向フラグを使用して、プロセッサが数値ラベルを探す方法を示すことができます。見つかったラベルの最初の出現が取得されます。

修飾子について:

f修飾子を使用して、ラベルがジャンプ命令から前方にあることを示します。後方に移動するには、b修飾子を使用する必要があります。

于 2012-11-24T07:19:24.563 に答える
1

これは、アセンブラのマニュアルに記載されています。

于 2013-03-16T12:31:13.943 に答える