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