組合語言程式設計 第3章概念梳理
組合語言程式設計
第3章概念梳理
基礎概念部分:{
字資料在記憶體當中的儲存:高-高 低-低
字資料的低位位元組存放在低地址記憶體單元
字資料的高位位元組存放在高地址記憶體單元
取低地址記憶體單元地址作為字資料地址,例如資料124EH:
12H儲存在偏移量為"2"的位元組單元,4EH儲存在偏移量為"1"的位元組單元
則從地址為"1"的地址單元取出的一個字資料為124EH
12為高位,故儲存在高位“2”單元,4E為低位儲存在低位”1“單元
資料在記憶體和CPU之間的傳送:
執行指令時,預設情況下,8086自動取暫存器DS中的值為記憶體單元的段地址
DS:資料段段暫存器,用於存放資料段的[段地址]
mov,add,sub等彙編指令中,訪問記憶體單元是,預設情況下指的是資料段。
關於常數(立即數運算):
不能作為第1個運算元(目的運算元)
第2個運算元(源運算元)時,如果最高位是十六位制的a~f或A~F,前面要加零。
例如不能寫成 mov 4000H,ax,應當寫成mov ax,4000H
不能寫成 mov ax,A400H,應當寫成mov ax,0A400H
兩個記憶體單元之間不能直接傳送資料:
mov [1],[2]
不能使用mov指令修改CS和IP的值
關於段暫存器:
- 兩個段暫存器之間不能直接傳送
- 不能把常數送到段暫存器
關於add指令:
- 運算元是記憶體單元時,指令中只給出[偏移地址]。預設,[段地址]在ds中
錯誤點:
- add指令的運算元不能同時是記憶體單元
- add [1],[2]
add指令的運算元不能是段暫存器,例如:
add ax,[2]
add ds,[2]
關於sub指令:
- 同add指令一樣,運算元是記憶體單元時,指令中只給出[偏移地址]。預設,[段地址]在ds中
錯誤點:
- 兩個記憶體單元不能直接使用sub指令相減,例如:
- sub[1],[2]
sub指令的運算元不能是段暫存器
棧的概念:
棧的特性:先進後出
- 兩個概念:棧底、棧頂
- 兩個操作:入棧、出棧
棧頂:最後入棧的字資料所對應的地址單元
棧底:固定的一端,棧區最高地址單元的前一個單元
入棧:把資料存入棧
出棧:從棧取出資料
與棧相關的暫存器SS和SP
SS:棧段段暫存器,用於存放棧段的[段地址]
SP:棧指標暫存器,用於存放棧頂的偏移指標
SS:SP對應的實體地址是棧頂的實體地址
(SS)*16+(SP)=棧頂的實體地址
[棧]的操作指令:push和pop
push ax 將ax的值壓入棧頂
pop ax 將棧頂的元素值彈出到ax暫存器
push [0] 將ds:0對應的記憶體單元字資料壓入棧
pop [0] 將棧頂的元素彈出到ds:0對應的記憶體單元
push和pop指令的注意點:
入棧和出棧均以字為單元
操作物件不能是常數
pop段暫存器當中,段暫存器不能是CS和SS
可以利用棧的定義完成如下兩個操作:
1、利用棧"保護現場"
保護現場原理: 先將暫存器bx,cx的值壓入棧,然後無論對cx與bx暫存器的值進行如何的操作,都能通過棧先進後出的原則,把兩個暫存器的值彈出返回。
2、利用棧實現資料交換
同樣利用先進後出的原則,先將兩個暫存器的值壓入,而後根據它們壓入棧的順序相同的進行彈出,即可實現兩個暫存器資料的交換。
關於[段]的小結
一段記憶體可以同時用作程式碼段、資料段、棧段
在8086CPU中,每個段的最大長度不能超過64KB,即 0000H~FFFFH