eryar

PipeCAD - Plant Piping Design Software.
RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
posts - 603, comments - 590, trackbacks - 0, articles - 0

Use DS and SS to access the same memory

Posted on 2016-05-02 23:14 eryar 阅读(1139) 评论(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 

 

wps_clip_image-15972

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

wps_clip_image-14001

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

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

 

wps_clip_image-13420

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

wps_clip_image-30020

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

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


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理