【組合語言】第 3 章 暫存器(記憶體訪問)

weixin_34185560發表於2017-06-20

版權宣告:本文為 gfson 原創文章,轉載請註明出處。
注:作者水平有限,文中如有不恰當之處,請予以指正,萬分感謝。

3.1 DS 和 [address]

  • DS 暫存器,通常用來存放要訪問的資料的段地址。
  • [...] 表示記憶體單元的偏移地址,DS 中資料為記憶體單元的段地址。

3.2 mov、add、sub 指令

  • mov 指令可以有以下形式:

    • mov 暫存器,資料
    • mov 暫存器,暫存器
    • mov 暫存器,記憶體單元
    • mov 記憶體單元,暫存器
    • mov 記憶體單元,段暫存器
    • mov 段暫存器,記憶體單元
    • mov 段暫存器,暫存器
    • mov 暫存器,段暫存器
  • add、sub 有以下幾種形式:

    • add 暫存器,資料
    • add 暫存器,暫存器
    • add 暫存器,記憶體單元
    • add 記憶體單元,暫存器
    • sub 暫存器,資料
    • sub 暫存器,暫存器
    • sub 暫存器,記憶體單元
    • sub 記憶體單元,暫存器
  • add、sub 不能對段暫存器進行操作,如 add ds,ax 是非法的。

3.3 資料段

  • 將記憶體當作資料段。
  • 用 ds 存放資料段的段地址,再根據需要,用相關指令訪問資料段中的具體單元。

3.4 檢測點 3.1

5351166-500e7866c2e3646d.png

5351166-b257b7b318521a34.png
  • 答案:
    第一題:


    5351166-52c7c1f06d5e6782.png

    第二題:


    5351166-d30b2eecd2287672.png

3.5 CPU 的棧機制

  • 棧頂的段地址存放在 SS 中,偏移地址存放在 SP 中。
  • 任意時刻,SS:SP 指向棧頂元素
  • push 和 pop 指令執行時,CPU 從 SS 和 SP 中獲得棧頂的地址。
  • push ax 的執行:
    5351166-1a2829b7029b7459.png
  • pop ax 的執行:
    5351166-401741327291e3f3.png
  • 棧頂超界
    • 8086CPU 不保證我們對棧的操作不會超界。
    • 8086CPU 只知道棧頂在何處,而不知道我們安排的棧空間有多大。
    • 我們程式設計時,需要自己考慮棧越界的問題。

3.6 push、pop 指令

  • push 和 pop 指令的格式可以如下:
    • push 暫存器 ;將一個暫存器中的資料入棧
    • push 段暫存器 ;將一個段暫存器中的資料入棧
    • push 記憶體單元 ;將一個記憶體字單元處的字入棧(注意:棧操作都是以字為單位)
    • pop 暫存器 ;出棧,用一個暫存器接收出棧的資料
    • pop 段暫存器 ;出棧,用一個段暫存器接收出棧的資料
    • pop 記憶體單元 ;出棧,用一個記憶體字單元接收出棧的資料

3.7 棧段

  • 將記憶體當作棧段。
  • 將 SS:SP 指向我們定義的棧段。

3.8 資料段、程式碼段、棧段

5351166-bd3ee364290f360d.png

5351166-52a6cc7286f777ba.png
  • 記憶體中到底是程式碼、資料還是棧,關鍵取決於 CPU 中暫存器的設定,即 CS、IP、SS、SP、DS 的指向

3.9 檢測點 3.2

5351166-ce08389160e1b1dd.png

5351166-32ca3d2b046d90d9.png
  • 答案:


    5351166-598ccb3104f4a4ed.png

3.10 實驗 2

5351166-386c3116c78a75bd.png

5351166-03b6dfe0385da03c.png
  • 答案:
    (1)略
    (2)在使用 t 命令進行單步追蹤的時候,產生了中斷,為了保護現場,CPU 將 PSW、CS 和 IP 依此入棧,導致了記憶體相關位置內容的改變。

相關文章