2014-05-16 24 views
3

我正在爲多CPU架構上的彙編程序存根編寫測試套件。存根是爲了將參數傳遞給C回調。我已經寫了測試,以涵蓋多個場景(例如,按值傳遞結構,混合不同本地大小的參數,混合浮點數與整數等),我現在想測試回調做某些東西會用完很多寄存器/堆棧插槽等。C函數儘可能多地運行寄存器

這個想法是試圖清除只能通過僥倖工作的實現(例如,值沒有正確放在堆棧上,但它碰巧仍然在某個寄存器中,所以你逃脫了與它等)。

誰能推薦一個好片的C/C++的,我可以在這裏作爲測試使用?我意識到註冊使用不同的體系結構變化很大,並不能保證在所有它會得到完全覆蓋,但它會是不錯的東西,給了信心合理量。由於

+5

我認爲,如果你想確保寄存器得到使用,你必須知道編譯器,或寫彙編器。否則,我相信這是在黑暗中拍攝的,因爲C標準沒有具體說明在什麼情況下要使用寄存器。甚至'register'關鍵字也只是編譯器的一個_suggestion_(現在,優化編譯器往往會更好地瞭解它。) – Floris

+0

可能不是100%可靠的,請嘗試聲明大量volatile變量。如果可能,請查看生成的代碼。 – eventHandler

+2

只需用匯編語言實現的函數替換回調函數即可將所有寄存器和返回值都封裝起來。 –

回答

2

沒有什麼在C/C++標準,以幫助你在這裏。最終,唯一可靠的方式就是編譯器編寫者完成它的方式。他們研究他們的編譯器生成的代碼並想出解決方法。

話雖如此,我能想到的可能沖洗掉一些常見問題的一些策略。

  1. 使用許多不同的參數類型和數字組合進行調用。例如,具有單個參數或返回值(char/short/int/long/float/double/pointer等)的函數將執行一定範圍的編譯器代碼生成(如果可能,可能會在寄存器中傳遞)。具有大量參數的相同函數將使用不同的策略,並且(在大多數情況下)沒有足夠的寄存器。
  2. 插入前導碼到被調用的函數,這樣在參數傳遞不立即使用,但寄存器得到填補與其他值。
  3. 使用可變參數。可變參數的調用約定(尤其是單獨的編譯和鏈接)實際上保證堆棧上的參數而不是寄存器中的參數。
  4. 練習很多不同的調用類型:不只是簡單的標量,而是按值結構,指向函數的指針,指向成員的指針等。
  5. 作弊。調用一個原型,但是投射函數指針,以便被調用者具有不同的原型。例如,在棧上調用double,但被調用函數有兩個long。需要一些編譯器工作的內部知識。

你會發現做這個東西的唯一預編寫的代碼是你選擇的編譯器的編譯器合規套件。

打破編譯器的樂趣。希望這裏有些東西能幫助你做到。