ASSUME DS:DATA这句之后,为什么还要MOV AX,DATA?

ASSUME DS:DATA
START: MOV AX,DATA
MOV DS,AX
不是已经ASSUME了DS了么,为什么还需要把数据段地址放到DS中呢?
为什么CS不用?每个程序代码段只有一个吗?
还有一个问题,系统中运行着两个程序a.exe和b.exe,他们每个程序都有自己的代码段、数据段、堆栈段吗?是a的数据段和b的数据段独立的吗?

楼主的这两个问题,其实都是微软公司在作怪。

ASSUME,是用于通知微软的MASM软件的。

为什么还需要把数据段地址放到DS中呢?
为什么CS不用?
这些是微软的DOS操作系统要求的。

这两条,就当是固定用法,不用费心琢磨。
应该学习这两句下面的程序,都是怎样编写的,下面的,才是重点。

每个程序代码段只有一个吗?
可以写很多个,但是当前使用的,只有一个。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-02-17
我好像只会第一个问题,而且我才学了五天,不知道我理解的对不对啊
是这样,1,数据的传送时通过 寄存器来实现的,START: MOV AX,DATA
MOV DS,AX
先把数据给AX,然后AX才能给DX
2:这个放的也不是数据段地址吧,地址有[]吧。
3:CS是放代码指令的,怎么能放里面呢。
第2个回答  2012-02-07
CS 不用那是因为程序是从start开始的!!追问

START是特定的标号吗?我换成START1行吗?为什么需要用END START?

追答

标号是可以随意的,编译的时候只是看最后的那个
XX:
end XX
end就是表示程序的结束,xx标号是开始
=========
现在的系统中,a和b的数据段是独立的,dos中2个程序只能执行一个,单任务的系统
====
问题不管了?还有什么不懂的?

本回答被提问者采纳
第3个回答  2012-02-10
核心的问题是 assume是伪指令 mov是汇编指令

为什么每段开头都要有mov ax,data mov ds,ax两句,不是有assume定义过段...
mov ds,ax data就是定义过的段地址,该段地址会以相对地址转成内存的绝对地址装入,以便运行。因为内存地址不能直接装入到ds中,所以才会通过ax寄存器将段地址装载到ds中。也就是说,伪指定assume只是将一个相对地址作为标号(如data)定义下来,而最终必须要装入段寄存器才可以运行的。

汇编:每一句前的mov ax,data是什么意思?
这句话的作用就是使DS的值为DATA.其中DATA为你定义的数据段,它的作用就是把数据段寄存器DS的值赋为DATA,就是让数据段指向正确的位置 data赋给AX只是起一个过渡作用,实际上是为了将值赋给DS DATA指DATA做的地址,应该是随机分配的 将AX的值赋给DS是一个过渡作用 ...

汇编中,MOV AX,DATA的DATA 是什么意思,怎么用
DATA 是段名,就是通过assume 来告诉汇编程序当前使用的各段的段名,比如 assume cs:code,ds:data 意思就是code是代表代码段cs,data代表数据段ds

汇编语言试题(求大神啊,万分感谢)
问题2:DS是默认的段地址寄存器,尽管前面有一个ASSUME指定了DS指向DATA段,但汇编语句需要自行初始化,即将DATA地址赋给DS,但DS只能和AX等寄存器进行互操作,因此需要先将DATA赋给AX。代码中前面的伪代码DATA SEGMENT\/ENDS声明使得DATA自动作为段地址变量;后面的实际代码中需要该代码支撑的语句比较多,但...

汇编语言中 mov ds,ax 移动的是ax中的数据还是只是它的一个复制...
mov ax,data这句,如果是前面有assume ds:data的情况,是将地址值传给ax;若data是一个变量,如DATAS SEGMENTdata dw 12H;DATAS ENDS中的data,则是把data中的数据给ax。 本回答由提问者推荐 举报| 答案纠错 | 评论 11 0 kabbin2010 采纳率:33% 擅长: 编程语言 学习帮助 魔兽争霸 汇编语言 C\/C++ ...

汇编语言!求大婶!!!
data ends code segment start:mov ax,data mov ds,ax ;获取DAY第一个字符的ascll码 mov al,byte ptr DAY ;因为7天,循环7次 mov cl,7 next:;因为输出英语缩写的时候,要用到cx,所以cx入栈,保护起来 push cx ;因为调用DOS功能的时候,要用到AX,所以同上 push ax ;调用DOS系统功能2号调用,...

汇编里面关于assume ds:data,cs:code...的问题
所以assume就是假设某一段寄存器和程序中的某一个xxx segment ... xxx ends定义的段相关联 通过assume说明这种关联,在需要的情况下,编译程序可以将段寄存器和某一个具体的段相联系 例如:assume cs:code ,ds:data data segment STR1 dw 10 data ends code segment start:mov ax,data mov ds,ax ...

微机原理及接口技术 看源程序答题
assume cs:code,ds:data \/\/代码段对应cs栈,数据段对应ds栈 start: mov ax,data \/\/数据段的偏移地址送ax mov ds,ax \/\/ax中存放的数据段偏移地址送到ds栈,可理解为同步 mov al,x \/\/数据x送入AX低8位寄存器AL add al,y \/\/数据y和数据x相加后覆盖AX低8位寄存器AL中的...

assume cs:code,ds:data,ss:stack 谁能清楚地解释它的意思吗?
所以汇编时汇编软件会把你写的变量换成偏移地址。而变量是在你假定的段里查找得到偏移地址,而实际上却是用ds:偏移地址来查找数据。所以当ds(es)不指在assume的指明的段中也可以运行,只是会得到另一个段的相应偏移地址处的内容。如:assume ds:段名1 mov ds,段2 mov ax,段1中的第二个变量 最...

汇编语言关于assume的用法
但是怎么找到data的地址的呢?这时候assume就派上了用场,它将ds和dseg相关联。变量在dseg段,就从ds寄存器里寻址。寻址的地址在哪呢?"mov ax,dseg mov ds,ax",就起到了这样的作用,它将逻辑段的地址装入寄存器中。为什么cs寄存器就不需要呢?人家就是这样规定的,至少在8086汇编上是这样。

相似回答