2014-03-03 155 views
1

傳入的說法,我想從調用函數一個的輸入參數訪問功能數據。有沒有辦法做到這一點?如何獲得調用函數的C或ASM

#define get_caller_incoming_arg(call) 0 
void B(int z) 
{ 
    int _arg0 = get_caller_incoming_arg(0); 
    printf ("in A(arg0): %x\n", _arg0); 
    printf ("in B: %x\n", z); 
} 

void A(int x) 
{ 
    int buff[10]; 

    for (int i = 0; i < 10; ++i) 
     buff[i] = i + 5; 

    B(buff[1]); 
} 

int main(int argc, const char * argv[]) 
{ 
    A(0xdeadbeef); 
    return 0; 
} 

目標機器是x86_64的運行OSX和編譯器鐺

+0

32位或64位? Linux還是Windows?什麼編譯器? –

+0

我會解決這個問題。這是64位的OSX與鏗鏘。但是對於大多數環境來說,不是64位的ABI是一樣的嗎? – mrdvlpr

+0

是的x86_64 ABI是相當一致的,但你沒有說你以前使用過64位。 :)下一個問題:是父函數總是相同的函數,還是你需要它爲可能有不同簽名的不同父函數工作? –

回答

0

嘗試創建一個全局變量,然後將參數值傳遞給該變量作爲在代碼

#define get_caller_incoming_arg(call) 0 
int value=0; 
void B(int z) 
{ 
int _arg0 = get_caller_incoming_arg(0); 
int valueofA=value; 
printf ("in A(arg0): %x\n", _arg0); 
printf ("in B: %x\n", z); 
} 

void A(int x) 
{ 
int buff[10]; 
value=x; 
for (int i = 0; i < 10; ++i) 
    buff[i] = i + 5; 

B(buff[1]); 
} 

int main(int argc, const char * argv[]) 
{ 
    A(0xdeadbeef); 
    return 0; 
} 
+0

謝謝,但這比你的解決方案更復雜。我無法更改可執行文件,因此必須通過彙編完成 - C語言中的代碼只是這個問題的一個例子。請參閱我的問題上的評論。 – mrdvlpr