当前位置: 代码迷 >> 汇编语言 >> CS,DS,SS 求解答解决方法
  详细解决方案

CS,DS,SS 求解答解决方法

热度:7585   发布时间:2013-02-26 00:00:00.0
CS,DS,SS 求解答
一段内存,可以即是代码的存储空间,又是数据的存储空间,还可以是栈空间,也可以什么不是。关键在于CPU中寄存器的设置,即:CS、IP、SS、DS的指向。
比如将10000H-1001FH按排为代码段,并在里面存储如下代码。
MOV AX,1000H
MOV SS,AX
MOV SP,0020H 
MOV AX,CS
MOV DS,AX
MOV AX,[0]
ADD  AX,[2]
MOV BX,[4]
ADD  BX,[6]
PUSH AX
PUSH BX
POP AX
POP BX  
在执行到ADD AX,[2] 代码段的代段就会被破坏掉!。。 CS、IP、SS、SP、DS哪个地方需要设置。。
书上说,CS IP SS SP  DS 都可以同一段内存中,但我实际运行中CS代码结构会被改变。。 
 
------解决方案--------------------------------------------------------
MOV AX,1000H
改为:MOV AX,0020H试试。在10020H内存空间处肯定放的是受到系统保护的系统程序,所以说要在一块空的内存空间内写入数据或指令才是安全的,所以我选用0020:0020这段。
------解决方案--------------------------------------------------------
这段代码是王爽那本书上的,要想让三个段在同一个段并且程序能够运行,需要改一下程序,你再到机器上在debug下调试,看看过程:
CODE SEGMENT
  ASSUME  CS:CODE,DS:CODE,SS:CODE
START:
  MOV AX,CS;如果这里依然是1000h的话,这个程序运行是没有问题的
  MOV SS,AX
  MOV SP,0020H  
  MOV AX,CS
  MOV DS,AX
  MOV AX,[0]
  ADD AX,[2]
  MOV BX,[4]
  ADD BX,[6]
  PUSH AX
  PUSH BX
  POP AX
  POP BX 
  MOV  AH,4CH
  INT 21H
CODE ENDS
  END START
当程序给SS和SP赋值之后,程序的末尾“MOV AH,4CH  INT 21H”就被破坏:因为这时相当于把堆栈的位置和深度都确定了,并且在栈中存入了“0DFEH”和SS中的堆栈段地址,所占的偏移地址为1CH、1DH、1EH和1FH,而这几个偏移地址对应的内容恰恰就是“MOV AH,4CH  INT 21H”。
   因此,如果把SP增大些,错开程序内容,在对SS和SP赋值之后就不会破坏程序了。
------解决方案--------------------------------------------------------
程序与数据在内存的位置程序员是清楚的

我们可以将数据和代码放在一个段中

但是程序员必须自己保证这些数据是安全的,不会自己破坏
------解决方案--------------------------------------------------------
本例中压栈出栈可能会破坏代码

这个要看你代码占内存的长度,在程序执行前科一查看内存,看代码段占用多少内存

所以程序不一定有错,不过最好不要写这种程序,可读性极差,容易出错

汇编的COM文件就是这种只有一个段,用来写磁盘引导程序
  相关解决方案