2013-04-30 71 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中的同一個地方。永遠。除非你正在使用一些非常小的嵌入式系統這樣的非常有限和確定性的環境。即使如此,我也不會推薦這種做法 - 如果您需要這種類型的總體控制,請在裸機上使用匯編語言和程序。