在C语言中跳过代码行

问题描述 投票:0回答:3

我是用gdb中的disassemble main即我用gdb中的disassemble main来确定下一行的地址,就这样跳转到了想要的行。有没有一种方法,我们可以用disassemble main确定下一行的地址wo.e在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");

}
c line skip
3个回答
0
投票

简单的回答是没有。没有办法确定下一行的地址。

你可以使用 goto 语句,其中一个例子可以看到 此处.

然而,我们仍然不鼓励这样做,因为这将导致混乱和不可读的代码。

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

事实上,你直接修改堆栈框架使得你的代码依赖于机器编译器。

就像@躲避风暴的人说的,只有一种方法可以完全按照你想要的方式来控制你的执行,那就是使用汇编。如果你想玩内嵌式汇编代码,可以查一下C语言中的asm()命令。你可以阅读更多关于这个的内容 此处 而这也会让你的代码机变得依赖。

你想做的是不可能的,因为代码内存可以(通常是)和数据内存分开。


1
投票

这不仅在机器与机器之间或操作系统与操作系统之间不具有可移植性,甚至不能保证从你的程序的一次执行到下一次执行都能正常工作。 一般来说,你不能依靠链接器将你的代码放在RAM的同一个地方。 永远不能。 除非你使用的是一些极度约束和确定性的环境,比如一个很小的嵌入式系统。 即使是这样,我也不推荐这种做法--如果你想要这种类型的完全控制,就使用汇编语言和在裸机上编程。

© www.soinside.com 2019 - 2024. All rights reserved.