鱼C论坛

 找回密码
 立即注册
查看: 12821|回复: 13

关于DS和CS。

[复制链接]
发表于 2012-3-4 00:11:49 | 显示全部楼层 |阅读模式
1鱼币
初期刚开始学习汇编,在DS和CS很迷糊,小甲鱼里边说到DS是数据段,CS是代码段,他们是怎么区别的,也就是说他们的作用是什么?比如说一段汇编指令,CS和IP的指向是一段汇编指令,还是一个内存单元的地址,请教下,,在此谢谢大家了。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-3-4 01:54:12 | 显示全部楼层
看一段视频如果看不大懂的情况下。
可以重复看两三遍,或是先跳过,回头再来看。
知识结构很重要。一个概念通常是在一定的基础准备下才可以理解。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-4 01:58:53 | 显示全部楼层
在汇编语言中,不管是数据还是代码,都是以数的形式储存在内存单元中的,而特殊寄存器所指向物理地址决定了它是数据还是代码。比如说在13A8:0100到0102内存中的数据是 B8 00 20,那么如果DS:[0]指向这里,那么这几个就是数据,而如果CS:ip指向这里,那么就是mov ax,2000的意思。这样楼主可懂?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-4 11:53:42 | 显示全部楼层
呵呵,这个好说,DS里面一般是存放数据的,当然CS里面也可存放数据,不过这样有些不合逻辑,就像男生可以上女厕所但不合理而且很容易产生误会一样,而如果是CS中的数据则一般是用JMP指令跳转开不执行,因为你是想把这些二进制数作为数据存放而不是指令执行。而且数据放在DS中,就可以直接用DS索引到数据从而进行操作,比较方便也明了。    至于你说的一段汇编指令,那它当然是存放在内存里面了,而正常情况下,CS:IP就指向了该汇编指令的首个内存单元的地址,哈哈,不知这样瞎扯你听懂了没.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-4 15:00:20 | 显示全部楼层
完全是数据的一段内存空间  当你需要把它当成数据 来使用那么就用DS:[]   你需要把它当成 代码来看 那就用 cs:ip 或者是看成栈 那就把它看成ss:sp  一段内存空间 你给他设定成数据段那就按照数据的方式去看  你给他设定成代码段   那就用代码的方式去看他  一段内存既可能是代码也可能是数据 也可能是一个栈 关键在于你怎么看!~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-4 16:44:43 | 显示全部楼层
cs和ip指向的是指令存放在内存单元的地址
ds和cs存放的只是数据地址,cpu按那地址去寻找数据
若是ds则cpu把它当作存放数据的地址
cs和ds相当于指针而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-4 22:06:09 | 显示全部楼层
1.cs和ip结合 指向的内存位置的数据,cpu就识别为代码。如果ds:[x]指向的内存位置,cpu就识别为数据,即使两种方式指向的内存位置相同,表示的意义也不一样。
2.就比如家庭里的爸爸,从你的眼里看去他是父亲,从妈妈的眼里看去他是老公,但是都是指的同一个人。cpu用不同的途径来看同样的数据,数据代表的角色就不一样了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-28 08:27:39 | 显示全部楼层
CS指向一段时汇编指令的内存段地址,而ds是将要访问数据段地址。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-28 09:50:09 | 显示全部楼层
路过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-1 02:32:03 | 显示全部楼层
在汇编语言中,不管是数据还是代码,都是以数的形式储存在内存单元中的,而特殊寄存器所指向物理地址决定了它是数据还是代码。比如说在13A8:0100到0102内存中的数据是 B8 00 20,那么如果DS:[0]指向这里,那么这几个就是数据,而如果CS:ip指向这里,那么就是mov ax,2000的意思。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-2-11 00:24:01 | 显示全部楼层
[address]表示一个偏移地址为address的内存单元。
用mov指令要存放内存单元时,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在ds寄存器中。
同样的,在debug中使用d命令和e命令(处理内存数据),只需给出单元的偏移地址,段地址默认在ds寄存器中;使用a命令,u命令和t命令(处理指令),只需给出单元的偏移地址,段地址默认在cs寄存器中;

上面说 段地址默认在ds寄存器中,后面又说,段地址默认在ds寄存器中。

到底段地址默认存在哪里?是DS还是CS?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-10 00:33:22 | 显示全部楼层
ds和cs都是段地址,cpu读取cs作为执行下一条指令的段地址而读取ds作为读取内存值的段地址,刚刚看完视频我觉得应该是这样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-13 08:40:04 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-13 16:26:16 | 显示全部楼层
1、CS和DS都是段寄存器
2、
/*
物理地址:内存单元在计算机中的唯一编号,CPU根据物理地址才能找到 对应 的 内存单元,内存单元中存着数据。
8086中的 物理地址 = 基础地址(段地址 * 16 ) + 偏移地址
计算机中的内存被人为看成是一维的连续内存块。内存单元中存储的数据的本质都是二进制。但是有些是代码,有些是数据。
所以就人为的设置那个段是代码段,那个段是数据段。CPU设计上也就有了 CS和DS。
CS:代码段寄存器 (存放着代码段的 段地址)
DS:数据段寄存器 (存放着数据段的 段地址)
*/
3:
/*
1: MOV BX 1000H
2: MOV DS BX
3: MOV AL [0]
*/
//上述中的1、2、3数字实际代码中不存在,仅表示行号。
//1:把 物理地址为 1000H 的 内存单元中的数据 送入 BX
//2:把 BX中存放数据的地址 送入DS,因为DS只能存放数据段地址
//3:[] 在mov 指令中标表示一个 内存单元,里面的 0 表示偏移地址。这里没有给出段地址,MOV 就无法根据物理地址做操作,CPU这时候就会默认自动去
DS中取段地址。取的地址为 1000H:0 ,然后MOV根据这个物理地址,找到对应内存单元中的数据,将这个数据送入AL寄存器中。
注:8086微处理器不支持直接将数据送入段寄存器,所以用BX作为中间变量。

纯手打,希望能采纳!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 03:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表