我想學習匯編,但我不確定這一點,但因為匯編是低級編程語言,所以為列印 Hello 撰寫的代碼在 windows 機器上和在 mac 上會有所不同。
我怎樣才能解決這個問題(如果這個問題存在的話),我可以從哪里開始學習實際的語言。
uj5u.com熱心網友回復:
首先,您需要很好地掌握編程,使用像 C 這樣的語言,因為它與匯編之前的級別一樣低——其他語言很棒,但隱藏了更多的低級細節。
C 有指標,這在匯編語言中很常用,所以在 C 中我們可以有一些演算法的陣列版本,也可以有相同的指標版本。在學習匯編之前了解/理解這些東西是很好的。
此外,您需要很好地掌握除錯——逐行查看程式運行;觀察變數變化;觀察控制流;將復雜的陳述句分解為更簡單的陳述句,以便您可以觀察其中發生的情況。除錯技能是編程的必要條件,在匯編中更是如此。
高級語言提供:
- 已命名、具有作用域、生命周期/持續時間、型別化并且可以根據其型別保存值的變數
- 易于嵌套的結構化陳述句/控制結構
- 用簡單熟悉的(數學)符號撰寫的運算式
相比之下,匯編/機器代碼提供:
- 簡單存在的物理存盤,沒有范圍,生命周期/持續時間,無型別等。
- CPU暫存器
- 主存盤器/RAM
- 控制結構的 if-goto-label 樣式
- 操作存盤和計算的指令
這些組裝特性在所有處理器中都是通用的。
要學習匯編,最好能夠將高級語言結構與處理器的功能聯系起來。一種方法是嘗試將用 C 或偽代碼撰寫的小程式翻譯成匯編。
尤其是在學習匯編語言時,了解您正在嘗試做什么總是一個好主意,這意味著首先擁有/撰寫演算法,并且最好可以測驗該演算法,以便知道它可以作業,因為它很小C 中的設計更改有時會導致匯編中的重大更改(例如重寫)。一種方法是使用偽代碼在紙上完成此操作,但我建議使用高級語言撰寫,首選 C,以便您可以實際運行和測驗您的演算法。
將演算法轉換為匯編:
- 將資料型別轉換為物理存盤概念,考慮大小、偏移和對齊
- 將全域變數轉換為物理存盤預留
- 將函式翻譯成匯編:
- 將引數和區域變數轉換為物理存盤,考慮使用情況、生命周期、大小和型別,以及與其他變數的重疊。
- 將結構化控制陳述句轉換為 if-goto-label 中的等效模式
- 將運算式翻譯成機器代碼指令
上面的討論應該對所有匯編語言之間的共同點有一些了解。學習一門匯編語言意味著理解上述主題,再加上學習某個特定處理器的實際指令集。您在一個處理器上學到的大部分知識將轉移到另一個處理器上,特別是如果您可以將上述廣泛/通用概念與任何給定指令集的細節分開的話。
指令集在可用暫存器數量、執行條件(if-goto-label)分支的方式、立即運算元的大小、二元運算子允許的運算元數量方面有所不同:兩個對三個、如何訪問記憶體、許多其他細節。正如其他人在對您的問題帖子的評論中所說的那樣,即使對于相同的硬體,暫存器的使用方式和為不同作業系統傳遞的引數也可能存在差異。
要開始學習匯編語言,我建議首先選擇一種簡單的處理器來學習物理存盤、控制結構模式、運算式評估和函式呼叫的概念。也許指令編碼也是如此,特別是如果您的興趣傾向于處理器內部。
相當簡單但真實和現代:RISC V,它與 MIPS 非常相似,兩者都有很好的 PC 模擬器以及許多在線學習資料。此外,這些處理器是真實的,具有可用的編譯器,可以將 C 代碼轉換為匯編代碼供您檢查。
更簡單的是 LC-3 — 一種非常基本、易于學習、面向教育的(玩具)處理器,具有良好的模擬器支持。缺點是缺乏真正的編譯器支持,但優點是簡單——它的局限性使這個處理器非常簡單易懂。
x86 是一種非常常見的處理器,盡管它背負了數十年的包袱,當您了解歷史和演變時,其中的許多包袱都是正確的;否則從頭開始學習可能會過于復雜。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/365361.html
