2013-04-30 112 views
0

我在gdb中使用了反汇编主程序,例如我在gdb中使用了反汇编main来确定下一行的地址,这就是我跳到所需行的方式。有没有一种方法可以使用反汇编主程序确定下一行的地址。即直接在c中。如果还有其他方法,请提及。在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

您正在超越C-标准,并且绝对没有可行的方法来做到这一点。为什么不让'fun'返回一个真或假的值,并决定如果你想跳过'printf'? – 2013-04-30 00:33:27

回答

0

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

您可以使用goto声明,其中一个示例可以看到here

但是,这仍然令人沮丧,因为它会导致混乱和不可读的代码。

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

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

正如@dodgethesteamroller所说,只有一种方法可以完全控制您的执行方式,您可以按照自己的方式完成,也就是使用汇编。如果要使用内联汇编代码进行操作,可以查看C中可用的asm()命令。你可以阅读关于here的更多信息,这也会使你的代码机器相关。

你想做的事是不可能的,因为代码存储器可以(通常是)独立于数据存储器。

1

不仅是从机器到机器或OS这不能移植到OS,它甚至没有保证,它会从你的程序的一次执行到下一个工作。一般来说,你不能依赖链接器将你的代码放在RAM中的同一个地方。永远。除非你正在使用一些非常小的嵌入式系统这样的非常有限和确定性的环境。即使如此,我也不会推荐这种做法 - 如果您需要这种类型的总体控制,请在裸机上使用汇编语言和程序。