+ -
当前位置:首页 → 问答吧 → 如果不assume ds:xxx,那么ds默认等于cs么?

如果不assume ds:xxx,那么ds默认等于cs么?

时间:2010-12-29

来源:互联网

如果我的代码里面只有
assume cs:code
没有
mov ax,data
mov ds,ax
这样的代码。

也没有assume ds:data

那么ds的默认值就是等于cs? 也就是默认是生成一个com程序?(只有一个段)?

谢谢指点!

作者: s4yeah   发布时间: 2010-12-29

不是这个意思。assume 语句对段寄存器的指定,主要是用来让汇编程序在需要的时候添加适当的段前缀指令的;其它方面倒没什么,更不会影响到段寄存器内容的设定或程序的模式。

作者: zara   发布时间: 2010-12-29

assume ds:data
是编译过程需要的,只负责告诉编译工具,data segment中的变量的段地址都是ds,所以编译到一些变量名时,就变成默认段地址的直接寻址,如[0000]等,如果换成assume es:data,则会编译成es:[0000].

mov ax,data
mov ds,ax
是执行过程中需要的,如果不是.com格式或没有用exe2bin把它变成.com格式,则允许这个程序时,DOS将它装入到内存,ds并没有取你定义的任何一个段的实际段地址,而是指向PSP(程序段前缀)。所以要有这2句让ds真正指向你的data段。


作者: shzhfu   发布时间: 2010-12-29

http://tieba.baidu.com/f?kz=164349500

 看下

作者: znxllyuan   发布时间: 2010-12-29

其实只要cs段用assume就可以了,数据段不用也可以,只要在代码段中把某个段赋给ds就可以了,比如:
data segment
  dd 12345678h
data ends
code segment
  assume cs:code  
start:  
  mov ax,data
  mov ds,ax
  mov ax,4c00h
  int 21h
code ends
  end start  

作者: leetow2003   发布时间: 2010-12-29