一箱季、普通寄存器 AX实愚、BX档悠、CX、DX (8086CPU 16位)
一個寄存器? 16位 == 兩個字節(jié) == 一個字 == (0000H~FFFFH)
任何兩個地址連續(xù)的內(nèi)存單元腊敲,N號單元和 N+1號單元,可以將它們看成兩個內(nèi)存單元 葫录,也可以看成一個地址為N的字單元中的高位字節(jié)單元和低位字節(jié)單元。
拿AX舉例? ?AX 高位 AH(一個字節(jié))? 低位AL(一個字節(jié))? 可以這樣分開使用
二领猾、段得來源意義
CPU訪問內(nèi)存單元時米同,必須向內(nèi)存提供內(nèi)存單元的物理地址。
8086CPU在內(nèi)部用段地址和偏移地址移位相加的方法形成最終的物理地址摔竿。
CPU可以用不同的段地址和偏移地址形成同一個物理地址面粮。
8086CPU用“(段地址×16)+偏移地址=物理地址”的方式給出內(nèi)存單元的物理地址,使得我們可以用分段的方式來管理內(nèi)存继低。
三熬苍、段寄存器就是提供段地址的
8086CPU有4個段寄存器:CS、DS、SS柴底、ES
CS:IP
CS和IP是8086CPU中最關(guān)鍵的寄存器婿脸,它們指示了CPU當前要讀取指令的地址。
CS為代碼段寄存器柄驻;
IP為指令指針寄存器狐树。
對于代碼段,將它的段地址放在 CS中鸿脓,將段中第一條指令的偏移地址放在IP中抑钟,這樣CPU就將執(zhí)行我們定義的代碼段中的指令;
同時修改CS野哭、IP的內(nèi)容:
jmp 段地址:偏移地址
jmp 2AE3:3
jmp 3:0B16
功能:用指令中給出的段地址修改CS在塔,偏移地址修改IP。
僅修改IP的內(nèi)容:
jmp 某一合法寄存器
jmp ax? (類似于 mov IP,ax)
jmp bx
功能:用寄存器中的值修改IP拨黔。
DS和[address]
CPU要讀取一個內(nèi)存單元的時候蛔溃,必須先給出這個內(nèi)存單元的地址;
對于數(shù)據(jù)段篱蝇,將它的段地址放在 DS中城榛,用mov、add态兴、sub等訪問內(nèi)存單元的指令時,CPU就將我們定義的數(shù)據(jù)段中的內(nèi)容當作數(shù)據(jù)段來訪問疟位;
在8086PC中瞻润,內(nèi)存地址由段地址和偏移地址組成。
8086CPU中有一個 DS寄存器甜刻,通常用來存放要訪問的數(shù)據(jù)的段地址
mov bx 1000H
mov ds,bx
mov ax,[0]? ? 1000:0處的字型數(shù)據(jù)送入ax
mov [0],cx? ? ? ?//cx中的16位數(shù)據(jù)送到 1000:0處
SS:SP
push绍撞、pop 實質(zhì)上就是一種內(nèi)存?zhèn)魉椭噶睿梢栽诩拇嫫骱蛢?nèi)存之間傳送數(shù)據(jù)得院,與mov指令不同的是傻铣,push和pop指令訪問的內(nèi)存單元的地址不是在指令中給出的,而是由SS:SP指出的祥绞。
我們要十分清楚的是非洲,push和pop指令同mov指令不同,CPU執(zhí)行mov指令只需一步操作蜕径,就是傳送两踏,而執(zhí)行push、pop指令卻需要兩步操作兜喻。
執(zhí)行push時:
先改變SP梦染,后向SS:SP處傳送。
執(zhí)行pop時:
先讀取SS:SP處的數(shù)據(jù),后改變SP帕识。
(2)push指令的執(zhí)行步驟:
1)SP=SP-2泛粹;
2)向SS:SP指向的字單元中送入數(shù)據(jù)。
(3)pop指令的執(zhí)行步驟:
1)從SS:SP指向的字單元中讀取數(shù)據(jù)肮疗;
2)SP=SP+2晶姊。
我們將10000H~1FFFFH這段空間當作棧段 ,SS=1000H 族吻,椕苯瑁空間大小為64KB ,棧最底部的字單元地址為1000:FFFE超歌。
任意時刻砍艾,SS:SP指向棧頂,當棧中只有一個元素的時候巍举,SS=1000H脆荷,SP=FFFEH。
棧為空懊悯,就相當于棧中唯一的元素出棧蜓谋,出棧后,SP=SP+2炭分。
SP原來為FFFEH桃焕,加2后SP=0,所以捧毛,當棧為空的時候观堂,SS=1000H,SP=0呀忧。
任意時刻师痕,SS:SP指向棧頂元素,當棧為空的時候 而账,棧中沒有元素 胰坟,也就不存在棧頂元素,所以SS:SP只能指向棧的最底部單元下面的單元 泞辐,該單元的偏移地址為棧最底部的字單元的偏移地址+2 笔横,棧最底部字單元的地址為1000:FFFE,所以椄篮穑空時狠裹,SP=0000H。
任意時刻汽烦,SS:SP指向棧頂元素涛菠。
(5)8086CPU只記錄棧頂,棧空間的大小我們要自己管理俗冻。
對于棧段礁叔,將它的段地址放在SS中,將棧頂單元的偏移地置放在 SP 中迄薄,這樣CPU在需要進行棧操作的時候琅关,比如執(zhí)行 push、pop 指令等讥蔽,就將我們定義的棧段當作椈烈祝空間來用。