0

我在 gdb 中使用 disassemble main 来完成它,即我在 gdb 中使用 dissassemble main 来确定下一行的地址,这就是我跳到所需行的方式。有没有一种方法可以使用 disassemble 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

这不仅不能从机器移植到机器或操作系统到操作系统,甚至不能保证它在程序的一次执行到下一次执行时都能正常工作。通常,您不能依赖链接器将您的代码放在 RAM 中的相同位置。曾经。除非您使用一些极其受限和确定性的环境,例如非常小的嵌入式系统。即使在那时我也不推荐这种做法——如果你想要那种类型的完全控制,请在裸机上使用汇编语言和程序。

于 2013-04-30T00:41:07.920 回答
0

最简洁的答案是不。没有办法确定下一行的地址。

您可以使用该语句,此处goto可以看到其中的一个示例。

然而,这仍然是不鼓励的,因为它会导致混乱和不可读的代码。

您所做的不是跳到下一行,而是实际上只是通过强制清除堆栈来跳过下一个函数调用(被压入堆栈)。您的代码只会跳过下一个“函数”而不是下一个“行”。我会将这种行为等同于调试器的“跳过”功能。您正在修改存储函数参数但不一定存储函数“代码”的堆栈。

您直接修改堆栈帧的事实使您的代码机器/编译器依赖。

正如@dodgethesteamroller 所说,只有一种方法可以完全控制您想要的执行方式,那就是组装。如果您想使用内联汇编代码,可以查找 C 中可用的 asm() 命令。您可以在此处阅读有关此内容的更多信息,这也将使您的代码机器依赖。

您想要做的事情是不可能的,因为代码存储器可以(并且通常是)与数据存储器分开。

于 2013-04-30T01:11:29.373 回答