2011-09-27 104 views
-2

我的問題是專門針對Windows C++編譯器和Visual Studio,但我被邀請去採訪一份財務工作,他們希望有人能夠編寫實時多線程代碼,他們可以在彙編級別分析生成的代碼一個C++編譯器。如何學習C++代碼和生成的彙編代碼之間的鏈接?

有什麼方法可以用來學習C++代碼和生成的程序集之間的鏈接,並達到這種熟練程度?

+3

1.學習程序集,2.學習一些編譯原理,3.檢查大量的編譯器輸出(嘗試位操作算法)。 –

+4

分析它是什麼?爲什麼這樣的代碼需要多線程?爲什麼它必須是實時的?對我來說聽起來不像財務 - 財務關鍵字(即我試圖避免的那些:)通常是'SQL,Oracle,存儲過程,觸發器'。 –

+2

您當然可以讓您的編譯器生成彙編作爲您可以檢查的輸出,但是如果您不知道彙編,那麼該輸出將幾乎沒有意義。你必須學會​​彙編,這超出了一個Q&A論壇的範圍,比如stackoverflow。 –

回答

1

首先要做的是學習彙編程序和機器代碼。 英特爾網站上有關於機器碼的一些非常好的文檔( )(儘管它可能比您需要的更詳細)。 是廣泛使用的兩種常見彙編程序格式: 使用的格式是Microsoft基於原始英特爾彙編程序,其中g ++使用 完全不同的東西(基於原始的Unix彙編程序 PDP-11),因此,必須選擇一個(儘管彙編語法本身很少是真正的問題—知道個別的指令所做的更重要)。

一旦你有一個如何閱讀彙編一些想法: 有選項輸出彙編大多數編譯器:用於VC++,使用/Fa(和/c爲好, 如果你不想實際上鍊接的結果);關於g ++,-S(其 使編譯器停止一旦它已經產生的彙編程序。在 情況下VC++的,彙編器將是在一個文件中xxx.asm(其中xxx.cpp 是文件的名稱被編譯),關於g ++ ,xxx.s嘗試 編譯一些代碼,不同級別的優化,然後 看看在編輯器中裝配

最後,如果問題是問,這可能是因爲面試官 關心的性能問題。;他真正感興趣的是 不管你是否知道各種操作的相對成本(或者風險 涉及多線程時;例如什麼操作是原子等)在 哪種情況下,它可能不會傷害指出像 位置(它決定了緩存命中百分比)往往更重要的是個別操作。

4

對此的簡單回答是,編譯代碼並在調試器中查看它。

調試器會以非常苛刻的方式向您顯示兩者之間的連接。下一步是理解編譯器理論,然後查看編譯器的源代碼以瞭解他們嘗試做什麼。

我認爲面試你的人可能一直在試圖瞭解你是否能理解所涉及的是什麼樣的努力 - 而不是真正知道如何去做。

+0

我希望我可以接受這兩個答案,你的描述非常簡潔明瞭,但我接受了另一個,因爲它對我的需求更爲詳細 – BlueTrin