Use DS and SS to access the same memory
eryar@163.com
CPU要讀寫一個內(nèi)存單元時,必須先要給出這個內(nèi)存單元的地址,在8086PC中內(nèi)存地址由段地址和偏移地址組成。8086CPU中有一個DS(Data Segment)寄存器,通常用來存放要訪問數(shù)據(jù)的段地址。
8086CPU也提供相關(guān)的指令以棧的方式LIFO(Last In First Out后進先出)來訪問內(nèi)存空間。這意味著在基于8086CPU編程的時候,可以將一段內(nèi)存當(dāng)作棧來使用。8086CPU提供入棧和出棧的指令:push和pop。比如push ax表示將寄存器AX中的數(shù)據(jù)入棧;pop AX表示從棧頂取出數(shù)據(jù)送入AX。
8086CPU中有兩個寄存器,段寄存器SS和寄存器SP,棧頂?shù)亩蔚刂反娣旁赟S中,偏移地址存放在SP中。任意時刻,SS:SP指向棧頂元素。
由上可知,通過DS可以用來訪問指定內(nèi)存中的數(shù)據(jù)。同樣地,通過SS和SP也可以用來訪問指定內(nèi)存中的數(shù)據(jù)。
如下代碼通過DS將內(nèi)存10000H~10002H中的數(shù)據(jù)設(shè)置成1111:
mov ax,1000
mov ds,ax
mov ax,1111
mov [0],ax
在debug中輸入上述指令,并查看10000H的內(nèi)存情況。執(zhí)行這些指令后內(nèi)存中的數(shù)據(jù)為:
由上圖可知,通過DS的方式改變了內(nèi)存10000H~10001H中的值。下面我們通過棧的方式將同樣的內(nèi)存單元設(shè)置成2222。
mov ax,1000
mov ss,ax
mov sp,2
mov ax,2222
push ax
將上述代碼輸入到debug中,并執(zhí)行后,得到如下圖所示的結(jié)果:
由上圖可知,相同的內(nèi)存單元中的值被修改了。說明也可以通過SS來設(shè)置內(nèi)存中的數(shù)據(jù)。只不過用SS的方式要復(fù)雜一些,需要自己來通過SP管理棧的大小。
那么問題來了,如果用DS或SS修改CS中的數(shù)據(jù),程序會不會出現(xiàn)矛盾呢?