我是在gdb中使用disassemble main做的,即我在gdb中使用了dissassemble main来确定下一行的地址,这就是我跳到所需行的方式。有没有办法我们可以使用反汇编主要确定下一行的地址w / o。即直接在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");
}
答案 0 :(得分:1)
这不仅无法从一台机器到另一台机器或操作系统再到操作系统,它甚至不能保证从一个程序执行到下一个程序都能正常工作。通常,您不能依赖链接器将代码放在RAM中的相同位置。永远。除非你使用一些非常小的嵌入式系统这样的极其受限和确定性的环境。即便如此,我也不推荐这种做法 - 如果你想要那种完全控制的话,可以在裸机上使用汇编语言和程序。
答案 1 :(得分:0)
简短的回答是否定的。无法确定下一行的地址。
您可以使用goto
语句,其中可以看到一个示例here。
然而,这仍然是气馁,因为它会导致代码混乱和不可读。
你正在做的不是跳到下一行但你实际上只是通过强制清除堆栈来跳过下一个函数调用(被推入堆栈)。您的代码只会跳过下一个“功能”,而不会跳过下一个“行”。我将此行为等同于调试器的“跳过”功能。您正在修改存储函数参数的堆栈,但不一定存储函数“code”。
直接修改堆栈帧这一事实使您的代码机器/编译器依赖。
正如@dodgethesteamroller所说,只有一种方法可以按照你想要的方式完全控制你的执行,那就是装配。如果要使用内联汇编代码,可以查找C中可用的asm()命令。您可以阅读有关here的更多信息,这也将使您的代码机器依赖。
你想做的事情是不可能的,因为代码存储器可以(通常是)与数据存储器分开。