2013-10-16 161 views
0

我正在處理C++項目的32-64位移植,其中包含一些64位平臺不支持的彙編代碼。我想介紹一下我必須遷移的項目的基本信息。該項目的用C++替換內聯彙編代碼

  • 輸出是用於由另一個C++項目

  • 這裏一個lib文件包含彙編代碼的上下文:

    int* a = Begin_args; 
    int* b = End_args; (where Begin_args and End_args are int*) 
    while (b > a) 
    { 
        int test = *(--b); 
        __asm push test 
    } 
    
  • 所以基本上我不得不更換聲明__asm push test

這是我現在面臨的起訴是:

  • 我無法找出流行語句相同推聲明

  • 我不能夠調試項目作爲該項目的輸出是一個lib文件。

  • 我嘗試使用堆棧,數組,隊列,但沒有解決。它不會拋出任何編譯錯誤,但在啓動應用程序時,它會崩潰。

所以我的問題是:

  • 我可以調試任何C++項目,其輸出是一個lib文件?

  • 我問了一些其他的論壇也這個問題,有人告訴我,試圖va_list但我無法理解va_list將如何工作,而不是的__asm push test

  • 那麼最後,如何用C++代替這個Asm代碼/如何取代這個Asm代碼呢?

任何幫助將不勝感激,因爲我在這個問題很長時間stucked。

+0

如果您對應用程序和庫進行了調試構建,併爲應用程序使用了庫的調試版本,那麼您應該能夠調試庫。 –

+0

'va_list'在這裏可能是正確的答案。你有沒有看過如何使用它的例子? –

+0

是的,我看,但我無法理解如何在這裏使用它。你能告訴我如何在代碼中使用它? 謝謝 – vsoni

回答

0

請記住,有可能不是等效於pop語句,因爲它取決於調用約定。

例如,如果X86調用約定之一,sp是函數期間移動和bp是先前sp(從下一個更高的堆棧幀的堆棧指針。

這意味着所述出口代碼用於函數可以是這樣的:

mov sp, bp ; just set sp to previous sp 
pop bp  ; pop previous sp 
ret   ; and return 

而且重要的一點,你已經與sp函數內做了什麼。例如:

func:    ; here, the stack has return address 
     push bp  ; push current bp 
     mov bp, sp ; put sp into bp 

     sub sp, 50 ; do whatever you want with sp here 

     mov sp, bp ; just set sp to previous sp 
     pop bp  ; pop previous sp 
     ret   ; and return 

在上面的代碼中的指令sub通常用於爲函數的局部變量分配空間。該函數的參數在調用之前被推送,因此可以使用[bp+N]來訪問,並且可以使用[bp-N]訪問局部變量。