簡體   English   中英

如何培養對 LC-3 匯編代碼的直覺?

[英]How to develop an intuition to code in LC-3 Assembly?

我讀到了 LC-3 是如何工作的,但我一生都無法弄清楚如何在 LC-3 程序集中進行編碼。 我的目標是能夠編寫簡單的程序,例如生成斐波那契數或對數組進行排序。

有人可以指點我的資源來學習這個嗎? 我精通 Python 和 Java,所以這些問題背后的基本邏輯對我來說很清楚。

學習匯編語言有幾個方面,它是處理器機器代碼的人類可讀版本。

基本上其他語言處於邏輯級別,而機器代碼非常處於物理級別

  • 一方面,這尤其體現在存儲概念上的差異:

    • 變量,它們是邏輯與 CPU 寄存器和 memory 是物理的
    • 邏輯變量是動態的,CPU寄存器和memory是固定的,永久的
    • 具有類型的變量與具有位的物理存儲

    因此,當我們編寫匯編語言時,我們翻譯了我們的偽代碼:具有許多生命周期有限的類型變量的邏輯代碼,部分是通過將邏輯變量映射到固定的物理資源上。 變量通常比 CPU 寄存器多,尤其是當某些寄存器具有專用用途時,例如堆棧或返回地址。

  • 另一方面,今天的其他語言通常采用結構化編程,而在匯編語言/機器代碼中,我們有 if-goto-label。

    所有結構化語句在 if-goto-label 中都有翻譯。 每個翻譯都是將結構化形式的模式轉換為 if-goto-label 形式的模式。 正確地遵循模式,您將重現偽代碼的控制流——在這里很容易走捷徑並犯令人困惑的錯誤,因此我鼓勵在這里采用有條不紊的方法。

  • 其他語言有豐富的表達式:具有許多優先級的運算符,並且可以使用()的復雜性。 機器代碼的指令(通常)最多需要 3 個操作數。

  • Function 調用、堆棧幀、參數傳遞、返回值是一個相當深的主題,function 序言和結語。

    • 參數需要由調用者放置到已知位置,並由被調用者從這些位置找到
    • 固定的物理寄存器需要在調用者和被調用者之間共享,因此有一個協議可以進行共享。 寄存器要么是調用保留的,要么是調用破壞的——每個組都適用於不同的場景,並且有自己的規則/要求才能正常工作。
    • 在匯編語言中可以有一個帶有堆棧指針的顯式調用堆棧,這是我們在 C 代碼中看不到的。
    • 可以有一個顯式的返回地址,它應該被認為是一個參數,被調用者用來返回給正確的調用者(因為它可以動態地不同)。
    • 返回值由被調用者放置到已知位置,並在返回時由調用者找到。
    • 保存調用保留的寄存器,局部變量存儲,例如 arrays,參數(包括返回地址)和局部變量可以在 function 調用中存活——所有這些東西都需要 ZCD69B4957F06CD818D7BF3D61980 的堆棧空間,通常以存儲空間的形式(雖然有時在 LC-3 上這些是作為全局變量完成的,這意味着不支持遞歸)。 如果堆棧空間用於其中任何一個,則該空間稱為堆棧幀。
      • Stack space is allocated in function prologue and released in function epilogue — these are sections of the function code that precede and follow the function body (they are executed only once per function invocation, they are never part of loops even if the entire body of the function 是一個循環)。
    • 通過查找您正在使用的“調用約定”來查看更多信息,它將描述寄存器共享組、專用寄存器(例如堆棧指針)以及參數和返回值位置。
    • 分析邏輯變量是否“在調用中有效”有助於選擇適當的 CPU 寄存器,並告訴我們是否需要在序言中保存該寄存器並在結尾中恢復它。

有關詳細信息,請參閱以下一些資源:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM