寄存器(内存访问)07 - 零基础入门学习汇编语言19
生活随笔
收集整理的這篇文章主要介紹了
寄存器(内存访问)07 - 零基础入门学习汇编语言19
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
第三章:寄存器(內(nèi)存訪問)07
?讓編程改變世界
Change the world by program
?
棧段
? 前面講過,對(duì)于8086PC機(jī),在編程時(shí),我們可以根據(jù)需要 ,將一組內(nèi)存單元定義為一個(gè)段。 我們可以將長度為 N(N ≤64K )的一組地址連續(xù)、起始地址為16的倍數(shù)的內(nèi)存單元,當(dāng)作棧來用,從而定義了一個(gè)棧段。 比如我們將10010H~1001FH 這段長度為 16 字節(jié)的內(nèi)存空間當(dāng)作棧來用,以棧的方式進(jìn)行訪問。 這段空間就可以成為棧段,段地址為1000H,大小為16字節(jié)。 將一段內(nèi)存當(dāng)作棧段,僅僅是我們在編程時(shí)的一種安排,CPU 并不會(huì)由于這種安排,就在執(zhí)行push、pop 等棧操作指令時(shí)就自動(dòng)地將我們定義的棧段當(dāng)作棧空間來訪問。 ?如何使的如push、pop 等棧操作指令訪問我們定義的棧段呢?
將SS:SP指向我們定義的棧段。 ?問題3.11
如果我們將10000H~1FFFFH這段空間當(dāng)作棧段,初始狀態(tài)是空的,此時(shí),SS=1000H,SP=? ?思考后看分析
我們將10000H~1FFFFH這段空間當(dāng)作棧段 ,SS=1000H ,棧空間大小為64KB ,棧最底部的字單元地址為1000:FFFE。 任意時(shí)刻,SS:SP指向棧頂,當(dāng)棧中只有一個(gè)元素的時(shí)候,SS=1000H,SP=FFFEH。 棧為空,就相當(dāng)于棧中唯一的元素出棧,出棧后,SP=SP+2。 SP原來為FFFEH,加2后SP=0,所以,當(dāng)棧為空的時(shí)候,SS=1000H,SP=0。 ?換個(gè)角度看
任意時(shí)刻,SS:SP指向棧頂元素,當(dāng)棧為空的時(shí)候 ,棧中沒有元素 ,也就不存在棧頂元素,所以SS:SP只能指向棧的最底部單元下面的單元 ,該單元的偏移地址為棧最底部的字單元的偏移地址+2 ,棧最底部字單元的地址為1000:FFFE,所以棧空時(shí),SP=0000H。 ?問題3.12
一個(gè)棧段最大可以設(shè)為多少?為什么? 思考后看分析 ?一個(gè)棧段最大可以設(shè)為多少?
分析:這個(gè)問題顯而易見,提出來只是為了提示我們將相關(guān)的知識(shí)融會(huì)起來。 首先從棧操作指令所完成的功能的角度上來看,push、pop等指令在執(zhí)行的時(shí)候只修改SP; 所以棧頂?shù)淖兓秶?~FFFFH,從??諘r(shí)候的SP=0,一直壓棧,直到棧滿時(shí)SP=0;如果再次壓棧,棧頂將環(huán)繞,覆蓋了原來?xiàng)V械膬?nèi)容。 所以一個(gè)棧段的容量最大為64KB。 ?段的綜述 == 總結(jié) + 啰嗦
? 我們可以將一段內(nèi)存定義為一個(gè)段,用一個(gè)段地址指示段,用偏移地址訪問段內(nèi)的單元。這完全是我們自己的安排。我們可以用一個(gè)段存放數(shù)據(jù),將它定義為“數(shù)據(jù)段”;
我們可以用一個(gè)段存放代碼,將它定義為“代碼段”;
我們可以用一個(gè)段當(dāng)作棧,將它定義為“棧段”;
? 我們可以這樣安排,但若要讓CPU按照我們的安排來訪問這些段,就要:對(duì)于數(shù)據(jù)段,將它的段地址放在 DS中,用mov、add、sub等訪問內(nèi)存單元的指令時(shí),CPU就將我們定義的數(shù)據(jù)段中的內(nèi)容當(dāng)作數(shù)據(jù)段來訪問;
對(duì)于代碼段,將它的段地址放在 CS中,將段中第一條指令的偏移地址放在IP中,這樣CPU就將執(zhí)行我們定義的代碼段中的指令;
對(duì)于棧段,將它的段地址放在SS中,將棧頂單元的偏移地置放在 SP 中,這樣CPU在需要進(jìn)行棧操作的時(shí)候,比如執(zhí)行 push、pop 指令等,就將我們定義的棧段當(dāng)作棧空間來用。
? 可見,不管我們?nèi)绾伟才?,CPU 將內(nèi)存中的某段內(nèi)存當(dāng)作代碼 ,是因?yàn)镃S:IP指向了那里。 CPU將某段內(nèi)存當(dāng)作棧 ,是因?yàn)?SS:IP 指向了那里。 我們一定要清楚 ,什么是我們的安排,以及如何讓CPU按我們的安排行事。 要非常的清楚CPU的工作機(jī)理,才能在控制CPU來按照我們的安排運(yùn)行的時(shí)候做到游刃有余。 ? 比如我們將10000H~1001FH安排為代碼段,并在里面存儲(chǔ)如下代碼:設(shè)置CS=1000H,IP=0,這段代碼將得到執(zhí)行。
? 可以看到,在這段代碼中,我們又將10000H~1001FH 安排為棧段和數(shù)據(jù)段。 10000H~1001FH這段內(nèi)存,既是代碼段,又是棧段和數(shù)據(jù)段。 一段內(nèi)存,可以既是代碼的存儲(chǔ)空間,又是數(shù)據(jù)的存儲(chǔ)空間,還可以是??臻g,也可以什么也不是。 關(guān)鍵在于CPU中寄存器的設(shè)置,即:CS、IP、SS、SP、DS的指向。 檢測點(diǎn)3.2 [buy]?獲得所有教學(xué)視頻、課件、源代碼等資源打包?[/buy] [Downlink href='http://kuai.xunlei.com/d/LCMHTRKPMYHS']視頻下載[/Downlink]轉(zhuǎn)載于:https://www.cnblogs.com/LoveFishC/archive/2010/11/17/3846973.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的寄存器(内存访问)07 - 零基础入门学习汇编语言19的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VRP 的发展
- 下一篇: VRRP在生产环境中的应用