Use DS and SS to access the same memory

Use DS and SS to access the same memory

[email protected]

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 

 

Use DS and SS to access the same memory_第1张图片

在debug中输入上述指令,并查看10000H的内存情况。执行这些指令后内存中的数据为:

Use DS and SS to access the same memory_第2张图片

由上图可知,通过DS的方式改变了内存10000H~10001H中的值。下面我们通过栈的方式将同样的内存单元设置成2222。

mov ax, 1000  
mov ss,ax 
mov sp,
2  
mov ax,
2222  
push ax 

 

Use DS and SS to access the same memory_第3张图片

将上述代码输入到debug中,并执行后,得到如下图所示的结果:

Use DS and SS to access the same memory_第4张图片

由上图可知,相同的内存单元中的值被修改了。说明也可以通过SS来设置内存中的数据。只不过用SS的方式要复杂一些,需要自己来通过SP管理栈的大小。

那么问题来了,如果用DS或SS修改CS中的数据,程序会不会出现矛盾呢?

你可能感兴趣的:(Use DS and SS to access the same memory)