Use DS and SS to access the same memory
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
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
mov ss,ax
mov sp, 2
mov ax, 2222
push ax
将上述代码输入到debug中,并执行后,得到如下图所示的结果:
由上图可知,相同的内存单元中的值被修改了。说明也可以通过SS来设置内存中的数据。只不过用SS的方式要复杂一些,需要自己来通过SP管理栈的大小。
那么问题来了,如果用DS或SS修改CS中的数据,程序会不会出现矛盾呢?