0

私はgdbの逆アセンブルメインを使用してそれを行いました。つまり、gdbの逆アセンブルメインを使用して次の行のアドレスを決定し、それが目的の行にスキップした方法です。逆アセンブル main を使用せずに次の行のアドレスを特定できる方法はありますか。つまり、c で直接。また、その他の方法があれば教えてください。

 #include<stdio.h>

fun()
{
  int i,*j;

  j=&i;

  j++;
  j++;
  j++;

  *j=*j+13; //to skip first printf +13


  *j=*j+21; //to skip first and second printf +21 ie. 21 + 13

  //*j=*j+13; //to skip first,second,third printf +13 ie. 21 + 13 + 13
}

main()
{
  int a;
  a=5;

  fun();
  printf("hello1");
  printf("%d\n",a);
  printf("hello2");

}
4

2 に答える 2

1

これは、マシンからマシンへ、または OS から OS への移植性がないだけでなく、プログラムの 1 回の実行から次の実行まで正しく機能することさえ保証されていません。通常、リンカがコードを RAM の同じ場所に置くとは限りません。これまで。非常に小さな組み込みシステムのような非常に制約があり決定論的な環境を使用している場合を除きます。そのような場合でも、この方法はお勧めしません。そのような完全な制御が必要な場合は、ベアメタルでアセンブリ言語とプログラムを使用してください。

于 2013-04-30T00:41:07.920 に答える
0

短い答えはノーです。次の行のアドレスを決定する方法はありません。

ステートメントを使用できます。gotoその例をここで見ることができます。

ただし、コードが煩雑で判読不能になるため、これは推奨されません。

あなたがしていることは次の行にスキップすることではありませんが、実際にはスタックを強制的にクリアすることによって次の関数呼び出し (スタックにプッシュされた) をスキップしているだけです。コードは次の「関数」のみをスキップし、次の「行」はスキップしません。この動作を、デバッガーの「ステップ オーバー」機能と同一視します。関数のパラメーターを格納するスタックを変更していますが、必ずしも関数の「コード」を格納するとは限りません。

スタック フレームを直接変更しているという事実により、コードはマシン/コンパイラに依存します。

@dodgethesteamroller が言ったように、実行を思いどおりに完全に制御する方法は 1 つしかなく、それはアセンブリを使用することです。インライン アセンブリ コードを試してみたい場合は、C で使用できる asm() コマンドを調べることができます。詳細についてはこちらをご覧ください。これにより、コードがマシンに依存するようになります。

コードメモリはデータメモリとは別の可能性があるため(通常はそうです)、あなたがしたいことは不可能です。

于 2013-04-30T01:11:29.373 に答える