鱼C论坛

 找回密码
 立即注册
查看: 8263|回复: 4

[技术交流] 再论代码move ax,data mov ds,ax的意义

[复制链接]
发表于 2013-1-14 09:56:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
看到有人提了个问题:
疑惑在于assume定义过各段的含义了,为什么在代码段内还要再写一遍数据段地址呢,代码段的地址不是自动加载到cs的吗
       首先,一个程序可以分多个段,即,多个代码段、多个数据段和多个栈段。每个程序都必须有一个入口点,即,本程序第一个要执行的指令的位置,包括段地址(将要赋给CS)和偏移地址(将要赋给IP)。当操作系统加载完程序后,从该位置进入你的程序执行。这也就是为什么当你的程序开始执行时,CS和IP都自动赋值的原因。

      其次,当访问数据段时,一般默认是用DS。如
mov ax,[0x02]
    这里,默认是使用段寄存器DS。如果你想用其它段寄存器,需要指令前缀。在汇编语言中,就是使用段超越前缀:
mov ax,[es:0x02]
    在这里,强制使用段寄存器ES。

      因此,assume伪指令的作用是,为一个段指示默认的段寄存器。一旦你用了assume ds:data1,es:data2,那么,当访问data1段时,默认使用段寄存器DS,访问data2段时,默认使用段寄存器ES。否则,必须使用段超越前缀。

      最的,和CS与IP不同,段寄存器DS、ES、FS、GS和SS在程序开始执行时,不能赋值,则必须手工来做。原因很简单,程序可能包含了好多数据段和栈段,应当访问哪个段,应当由程序的编写者自己决定,直接赋值太武断了。比如,可能我希望先访问data2,而不是data1:
mov ax,data2
mov ds,ax
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-1-14 13:18:46 | 显示全部楼层
你希望先访问data2,而不是data1:
是不是可以把 cs: ip先指向 data2呢???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-1-14 13:30:29 | 显示全部楼层
额滴神,data1和data2是数据段,怎么可以用CS:IP指向它呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-1-15 10:15:10 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-1-15 10:25:20 | 显示全部楼层
林之白狼 发表于 2013-1-15 10:15
CPU是不区分段的吧?他只会把CS:IP所指向的指令当做要执行的命令

不明白你的意思。不知所云。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-10-8 00:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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