8086 DS 和 ES 寄存器
DS 寄存器和 ES 寄存器:
DS? 寄存器和? ES? 寄存器都屬于段寄存器,其實(shí)它們和? CS? 寄存器以及? SS? 寄存器用起來(lái)區(qū)別不大,
既然是段寄存器的話,自然它們存放的就是某個(gè)段地址了 。
通過(guò)上面對(duì)基礎(chǔ)知識(shí)的介紹呢,我們已經(jīng)知道,如果? CPU? 要訪問(wèn)一個(gè)內(nèi)存單元時(shí),
我們必須要提供一個(gè)指向這個(gè)內(nèi)存單元的物理地址給? CPU ,
而我們也知道在? 8086? CPU? 中,物理地址是由段地址左移 4? 位,然后加上偏移地址形成的,
所以,我們也就只需要提供段地址和偏移地址即 OK 。
8086? CPU? 呢,提供了一個(gè)? DS? 寄存器,并且通常都是通過(guò)這個(gè)? DS? 段寄存器來(lái)存放要訪問(wèn)的數(shù)據(jù)的段地址 。
DS(Data? Segment):很顯然,DS 中存放的是數(shù)據(jù)段的段地址 。
但是這里不得不再點(diǎn)一下,那就是我們對(duì)段的支持是在? CPU? 上體現(xiàn)的,而不是在內(nèi)存中實(shí)現(xiàn)了段,
所以事實(shí)上我們使用的段其實(shí)是一個(gè)邏輯概念,即是我們自己定義的,
再說(shuō)白了,我定義一個(gè)段,我說(shuō)它是數(shù)據(jù)段那它就是數(shù)據(jù)段,我說(shuō)它是代碼段那么它就是代碼段,
它們其實(shí)都是一塊連續(xù)的內(nèi)存而已,至于為什么要區(qū)分為數(shù)據(jù)段和代碼段,
很明顯,是用來(lái)給我們編程提供方便的,即我們?cè)谧约旱乃枷肷匣蛘哒f(shuō)是編碼習(xí)慣上規(guī)定,
數(shù)據(jù)放數(shù)據(jù)段中,代碼放代碼段中 。而我們?cè)谑褂脭?shù)據(jù)段的時(shí)候,為了方便或者說(shuō)是代碼的編寫(xiě)方便起見(jiàn),
我們一般把數(shù)據(jù)段的段地址放在? DS? 寄存器中,當(dāng)然,如果你硬要覺(jué)得? DS? 不順眼,那你可以換個(gè)? ES? 也是一樣的,
至于? ES(Extra? Segment)? 段寄存器的話,自然,是一個(gè)附加段寄存器,如果再說(shuō)得過(guò)分點(diǎn),
就當(dāng)它是個(gè)擴(kuò)展吧,當(dāng)你發(fā)現(xiàn),你幾個(gè)段寄存器不夠用的時(shí)候,你可以考慮使用?? ES? 段寄存器,
在使用方式上,則和其他的段寄存器沒(méi)什么區(qū)別? 。
下面看一個(gè)介紹使用? DS? 寄存器的? Demo:
ASSUME CS:CODESCODES SEGMENTSTART:MOV AX,1000HMOV DS,AXMOV AL,1MOV BX,0MOV CX,5 ;設(shè)計(jì)一個(gè)循環(huán),讓其循環(huán) 5 次s: MOV [BX],AL ;這里 [BX] 并沒(méi)有指定段地址哦INC ALINC BXLOOP s MOV AH,4CHINT 21H CODES ENDSEND START上面的代碼所做的事情,就是循環(huán)將? 1,2,3,4,5 寫(xiě)入到地址? 1000H:0000H ,1000H:0001H,
1000H:0002H,1000H:0003H,1000H:0004H? 中,
語(yǔ)句的執(zhí)行過(guò)程如下:首先我們來(lái)看尚未執(zhí)行上述任何指令時(shí)棧中的數(shù)據(jù)情況:
而當(dāng)循環(huán)執(zhí)行完成以后,我們?cè)賮?lái)看內(nèi)存? 1000H:0000H 處的值:
在這里,我們可以看到確實(shí)達(dá)到了我們預(yù)期的效果,但是大家注意看代碼:
s: MOV [BX],AL ;這里 [BX] 并沒(méi)有指定段地址哦INC ALINC BXLOOP s這里可以看到,我們?cè)??[BX]??中并沒(méi)有給其指定段地址,而只有一個(gè)偏移地址,
但是根據(jù)我們一開(kāi)始的介紹,必須要有段地址和偏移地址才能夠定位內(nèi)存單元,
莫非這里出問(wèn)題了?
其實(shí)不是的,因?yàn)槲覀冊(cè)谧钋懊娑x了段地址?? DS? 為? 1000H,
當(dāng)我們定義好段地址后,每一次? CPU? 執(zhí)行到??[BX]? 時(shí),便會(huì)自動(dòng)或者說(shuō)是默認(rèn)的從? DS? 中取值,
并且將取得的值作為段地址,因此,當(dāng)??[BX]? 為? 0001H? 時(shí),CPU? 會(huì)從?? DS? 中取得一個(gè)? 1000H ,
由這兩個(gè)一合成即可以得到正確的物理地址?? 1000H:0000H 。
最后還提醒一點(diǎn),那就是?? 8086? CPU? 不支持直接將一個(gè)數(shù)據(jù)送入段寄存器中,
也就是下面的做法是錯(cuò)誤的:
MOV DS,1000H總結(jié)
以上是生活随笔為你收集整理的8086 DS 和 ES 寄存器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。