我有一個由混合C和x86彙編代碼組成的應用程序。出於複雜的原因,彙編代碼想要知道(聲稱的程序計數器)值是否是C代碼的目標代碼所在區域中的地址。過去這個應用程序運行良好,包括這個古怪的檢查。Visual Studio:使用編譯代碼保留代碼順序/邊界
我真正需要的是我信任的C代碼區域的「書擋」。 這當然假設編譯的C代碼相對密集地存放在加載映像中。
我目前通過定義虛擬函數LowestAddress(){}和HighestAddress(){}並將它們分別放在包含代碼的文件中的第一個和最後一個來獲得我的手勢。彙編代碼只是將感興趣的值與這些函數的地址進行比較,以確定該值是否在C代碼範圍內。糟糕的是,這是第二個假設,即函數在內存中以源文件的文本順序進行排序,這在過去的Visual Studio的舊版本中顯然是正確的。
唉,不再,當然不是VS2010編譯鏈接時代碼。 (我不知道其他[非]優化設置是做什麼的。)在使用VS2010進行檢查時,我的LowestAddress函數顯然位於目標代碼中間,用於其他一些C函數。
我該如何(重新)實施這些書擋?某種細分控制? VS 2010中可用的選項似乎沒有提供任何有用的東西。 (我明白,一個非常聰明的編譯器可能實際上會重新安排代碼以最小化基於調用圖的緩存行衝突。MS實際上是否聰明?)。我並沒有真正堅持按照文本順序訂購全部這個地區的功能;我只需要該地區的上限和下限。
[我要去嘗試關閉鏈接時代碼生成,這是一個[全球]調用圖可以構建的唯一場所,並看到有什麼樣的影響。]
歡迎來到Stack Overflow!請注意,標籤不是關鍵字。也就是說,stuf- * wait *。 33k代表,並且你剛創建了新的標籤'visual'和'studio'?!來吧,艾拉! ;) – Charles
我有一個奇怪的瀏覽器問題,因爲我輸入了問題,直到現在才失去了訪問權限。我可能會得到它的權利,但總是有好的幫助。 –
我能想到的2個選項是鏈接器選項/ ORDER,您可以在其中指定可執行文件中的函數順序,也許可以在#pragma部分的幫助下指定部分。但我沒有嘗試這些。 – Christopher