第三章 寄存器(內存訪問)
一、一個字=兩個字節。地位字節存放在低地址單位中,高位字節存放在高地址單元中,取低地址內存單元作為字數據地址。(小端法)
引入概念:字單元:存放一個字型數據的內存單元,由兩個地址連續的內存單元組成。
N地址字單元:將起始地址為N的字單元簡稱為N地址字單元。
註:任何兩個地址連續的內存單元,N號單元和N+1號單元,可以將它們看成兩個內存單元,也可以看成一個地址為N的字單元中的高位字節單元和低位字節單元。
二、8086CPU自動取DS中的數據為內存單元的段地址。
(eg:mov bx,1000H
mov ds,bx
mov al,[0]
[...]表示一個內存單元,[...]中的0表示偏移地址,ds值為段地址。由ds和偏移地址能得到物理地址。
操作數是內存單元時,指令中只給出「偏移地址」。 默認,「段地址」在ds中。
mov ds,1000H(錯誤)原因:8086CPU不支持將數據直接送入段寄存器的操作。)
三、字的傳送:註意區分mov ax,[0]和mov al,[0]
mov ax,[0]:字型數據傳送
mov al,[0]:字節數據傳送
四、mov、add、sub指令
註意:1、常數不能作為目的操作數。
2、作為源操作數時,若最高位是16進制的A~F,前加0。
3、兩個操作數長度要一致。
4、兩個內存單元之間不能直接傳送數據。(eg:mov [1], [2] ×)
5、不能使用mov指令修改CS和IP的值。
6、兩個段寄存器之間不能直接傳送;不能把常數送到段寄存器。(eg:mov ds, cs × mov ds, 1000H ×)
形式:mov 寄存器,數據 mov 內存單元,寄存器
mov 寄存器,寄存器 mov 段寄存器,寄存器
mov 內存單元,常數 mov 內存單元,段寄存器
mov 寄存器,段寄存器 mov 段寄存器,內存單元
mov 內存單元,數據
mov [1],byte ptr 3和mov byte ptr [1],3
因為數據3占用的字節數不確定,而計算機系統只執行確定的東西,用btye ptr 確定占用的字節數。
add與sub形式幾乎相同,以add為例:
add 寄存器,數據 add 寄存器,寄存器
add 寄存器,內存單元 add 內存單元,寄存器
段寄存器不可以用在算術指令中。
五、數據段
用ds存放數據段的段地址,再根據需要,用相關的指令訪問數據段的具體單元。
六、棧
特點:只能在一段進出。
後進先出。
七、CPU提供的棧機制
註:8086CPU中棧以字為單位。
引入指令:PUSH(入棧:把數據存入棧)和POP(出棧:從棧取出數據)
棧頂:最後入棧的字數據所對應的地址單元。
棧底:固定的一端,棧區最高地址單元的前一個單元。
棧為空時,棧頂指向棧底+2
寄存器:SS和SP。
SS:棧段段寄存器,用於存放棧段的「段地址」
SP:棧指針寄存器,用於存放棧頂的偏移地址。
(SS) × 16 + (SP) → 棧頂的物理地址
任意時刻,SS:SP都指向棧頂元素。
進棧: 棧頂上移兩個單元,即: 棧頂-2 → 棧頂 ,存入數據。
出棧: 棧頂下移兩個單元,即: 棧頂+2 → 棧頂 ,取出數據。
八、越界的問題
當棧滿的時候,再使用push指令入棧; 當棧空的時候,再使用pop指令出棧。
編程時要根據可能用到的最大棧空間,來安排棧的大小,防止入棧的數據太多而導致的超界;執行出棧操作也要註意,以防棧空的時候繼續出棧而導致的超界。
九、push、pop指令
形式:push 寄存器
push 段寄存器
push 內存單元
註:1、棧的操作都是以字為單位。
2、操作對象不能是常數。
3、pop 段寄存器中,段寄存器不能是CS和SS。
棧的初始化條件:eg:mov ax,1000H
mov ss,ax
mov sp,0010H
十、棧段
一個棧段的最大容量為64KB。
「段」是一個邏輯上的概念。 編程時,可根據需要指定一段內存區用作數據段、代碼段或是棧段。
用作數據段時,要把段地址→DS。
用作棧段時,要把段地址→SS,棧頂偏移地址 → SP。
用作代碼段時,段地址→CS,要取的指令偏移地址→IP。但CS和IP的值不能使用mov改變。
第三章 寄存器(內存訪問)