寄存器:CPU內能夠存儲數據的器件
AX,BX,CX,DX,爲什麼要分高字節和低字節?因爲8086要向上向上兼容80386,80386是 8 位機。
程序運行
CS:CPU要運行的程序的段地址
IP:CPU要運行的程序的偏移地址
CS:IP共同指向程序的首地址
數據的內存空間
DS : 保存要操作的數據的段地址
【address】內存單元:要操作的內存的偏移地址
jmp指令和DS寄存器
jmp指令可以同時修改CS、IP的內容,可用指令“jmp 段地址:偏移地址”,使CPU從指定地址讀取命令【注意:使用jmp的格式並不是這樣的,彙編編譯器並不識別這樣的,只能在 debug 中用】
如 jmp 2AE3:3 執行後:CS = 2AE3H, IP = 0003H, CPU將從2AE33H處地區指令
若僅想修改IP的內容,可用指令“jmp 某一合法寄存器”完成
eg:
jmp ax , 將ax的內容賦值給IP寄存器,用寄存器的值修改IP值
DS
通常用來存放要訪問數據的段地址
讀取某一內存單元數據的方式
訪問1000:0地址的數據
mov bx, 1000H //DS不支持mov ds 1000H,所以只能用寄存器傳值的方式將1000H傳入DS
mov ds, bx //DS支持寄存器傳值
mov al, [0] //[……]表明一個內存單元,[0]表明該內存單元的偏移地址爲0.
上面3步執行完就可以將1000:0的數據傳到AL寄存器中
MOV在DOS下的操作數的傳輸方向
段寄存器:CS/DS/SS
通用寄存器: AX/BX/CX/DX
內存單元:[address]、[ 通用寄存器 ]
小結
1、字在內存中存儲時,要用兩個地址連續的內存單元來存放,字的低位字節放在低地址單元中,高位字節存放在高地址單元中。
2、用 mov 指令要訪問內存單元,可以在mov指令中只給出單元的偏移地址,此時,段地址默認在DS寄存器中
3、[address] 表示一個偏移地址爲 address 的內存單元。
4、在內存和寄存器之間傳送字型數據時,高地址單元和高8位寄存器、低地址單元和低 8 位寄存器相對應。
5、mov 、add 、sub 是具有兩個操作對象的指令。jmp 是具有一個操作對象的指令。
棧
SS :提供棧頂的段地址
SP :提供棧頂的偏移地址
SS:SP:指向棧頂的地址
- push命令的的執行過程
第一步:SP = SP - 2,SS:SP指向當前棧頂前面的單元,以當前棧頂前面的單元爲新的棧頂
第二步:將數據送入 SS:SP 指向的內存單元處, SS:SP 此時指向新棧頂
任意時刻,SS:SP 指向棧頂元素。當棧爲空時,SS:SP指向棧最底部內存單元偏移地址+0001H的內存單元
8086 沒有對棧頂上限和棧底進行監控,所以發生棧頂超界問題無法報警或者提示。
PUSH 和 POP
可操作的對象有寄存器、段寄存器、內存單元【以字單元爲單位】
POP 的操作結果是將棧頂的字傳給操作的對象,不一定將原來的數傳給寄存器,如下所示
mov ax,1000
mov bx,2000
push ax
push bx
pop ax //此時棧頂的數值是2000,因爲是後來壓入的
pop bx
小結:
1、出棧、入棧指令根據 SS:SP 指示的地址,按照棧的方式訪問單元
2、push指令的執行步驟:1)SP = SP - 2; 2) 向 SS:SP 指向的字單元中送入數據。
3、pop 指令的執行步驟: 1)從 SS:SP 指向的字單元中讀取數據; 2) SP = SP + 2
4、任意時刻,SS:SP 指向棧頂元素
5、8086 CPU 只記錄棧頂,棧空間的大小我們要自己管理
6、push、pop 實質上是一種內存傳送指令,注意他們的靈活應用
段的綜述【清楚明瞭,比大學老師講的清楚一萬倍】