1. 程式人生 > >《組合語言(第三版)》王爽筆記(3)

《組合語言(第三版)》王爽筆記(3)

第三章 暫存器(記憶體訪問)

使用0、1記憶體單元存放資料0420H, 則低地址單元0存放低位位元組20,高地址單元存放高位位元組04。 字單元:即存放一個字型資料(16位)的記憶體單元,由兩個地址連續的記憶體單元組成,高地址存放高位位元組,低地址存放低位位元組。 將起始地址為N的字單元叫做 N地址字單元。(區分N地址單元) DS暫存器通常存放要訪問資料的段地址 MOV指令:可以將資料送入暫存器,可以將一個暫存器內容送入另一個暫存器,還可以將一個記憶體單元的內容送入另一個暫存器。 實現上述加粗的操作:MOV 暫存器名,記憶體單元地址 記憶體單元地址用[…]表示,…為偏移地址,段地址預設為DS中的資料。 []表示操作物件是一個記憶體單元 如何將段地址送入段暫存器DS? 8086不支援資料直接送段暫存器,MOV DS,1000 是非法指令,應該先將1000送入一個通用暫存器,如BX。 MOV BX,1000 MOV DS,BX PS:使用MOV […], 暫存器名 還可以實現暫存器內容傳遞給記憶體單元。

由於8086有16根資料線,可以一次性傳遞一個字型資料(兩個記憶體單元): MOV BX,1000 MOV DS,BX MOV AX,[0] \將10000H處的字型資料傳遞給AX

參考程式碼段定義資料段:長度小於64KB,地址連續、起始地址為16倍數的一組記憶體單元,用於存放資料。 訪問資料段方式:DS存放資料段段地址,再用具體指令訪問具體單元。

檢測點3.1

1.2662 E626 E626 2662 D6E6 FD48 2C14 0000 00E6 0000 0026 000C 2.在這裡插入圖片描述 記憶體中資料和程式指令沒有區別,都是二進位制形式,關鍵在於CPU如何解讀。

棧:一種具有特殊訪問形式的儲存空間,資料“後進先出”LIFO last in first out 棧有兩種基本操作:入棧(將一個新的元素放在棧頂)、出棧(從棧頂取出一個元素)。 8086提供相關指令以棧的形式訪問記憶體空間,PUSH(入棧)和POP(出棧)。push ax表示將ax中資料送入棧中,pop ax表示從棧頂取出資料送入ax,push和pop操作均以字為單位進行。示例如下: 在這裡插入圖片描述

為了放入和取出元素,CPU必須知道棧頂位置,SS:SP(段地址:偏移地址)在任意時刻指向棧頂元素。設定SS時要用一般暫存器傳遞值,設定SP則可以直接使用MOV指令。 下圖為push指令執行過程(先改變SP再傳資料至SS:IP)(pop為先傳資料至SS:IP再改變SP值): 在這裡插入圖片描述 Attention:如果將10000H~1000FH看做棧空間,初始狀態為空,此時SS=1000H,則SP=0010H。 8086沒有防止棧頂超界的功能,所以要特別注意棧空間的安排,防止入棧資料過多以及棧空後繼續出棧。 棧段:長度小於64KB的一組地址連續,起始地址為16倍數的記憶體單元,當做棧空間。

各種“段”: 在這裡插入圖片描述 一段地址,可以既是程式碼儲存空間又是資料儲存空間,還可以是棧空間,也可以什麼都不是,關鍵在於CPU中暫存器的設定(CS\IP\SS\SP\ DS)。

檢測點3.2

1.MOV AX,2000H MOV SS,AX MOV SP,0010H 2.MOV AX,1000H MOV SS,AX MOV SP,0

實驗2

debug中T指令(一般一次執行一條指令)在執行修改暫存器SS的指令時,下一條指令也緊接著被執行。(涉及中斷機制)