3

strcmp関数の呼び出しで0を返したいのですが、これはつまり

int strncmp(const char *s1, const char *s2, size_t n);

const char *s1const char *s2同じ文字列が含まれている必要があります。s2文字列「hello」を指し、 4の場合、に対応する10進値nに渡すにはどうすればよいですか。s1hello

 8049e87:       c7 44 24 08 04 00 00    movl   $0x4,0x8(%esp) // 4
 8049e8e:       00
 8049e8f:       c7 44 24 04 80 bd 04    movl   $0x804bd80,0x4(%esp) // the constant is "hello"
 8049e96:       08 
 8049e97:       89 04 24                mov    %eax,(%esp) // The contents of %eax are a decimal (%d)
 8049e9a:       e8 61 ec ff ff          call   8048b00 <strncmp@plt>
 8049e9f:       85 c0                   test   %eax,%eax // I want this to be 0!

ASCIIで「h」の10進値を渡してみましたが、正しい方向に見えましたが、完全ではありませんでした。

4

1 に答える 1

3

strncmp定義により、大文字小文字と長さが同じ 2 つの文字列 の戻り値は 0 です。

アセンブリ コードを見ると、次の行があります。

test   %eax,%eax

関数の一部ではありませんstrncmp

デバッガを使用して、この命令にブレークポイントを設定します。レジスタを調べます。値はEAXゼロである必要があります (strncmp関数が結果をレジスタに返すかどうかによって異なりますEAX)。

testアセンブリ命令は、パラメータの値に応じて条件コードを設定します一般的な条件コードビットは、式がゼロであることを示すゼロビットです。条件コードがゼロの場合、次の命令はジャンプの可能性があります。

関数の結果を数学的なステートメントまたは式で使用strncmpすると、コンパイラは異なるコードを生成する場合があります。

このフラグメントを試してください:

  volatile int result = 0x55;
  volatile int a_value = 3;
  result = (strncmp("Hausaufgaben", "Hausaufgaben", 256) + 27) / 3;
  printf("Result is: %d\n", result);

から値を保存するためにコンパイラが必要な理由はありますstrncmpか?

値を定数の数値ゼロと比較するためにコンパイラが必要な理由はありますか?

于 2011-05-14T00:54:24.133 に答える