设置段寄存器是必须的吗

123anmanny 2003-06-19 04:36:22
两个一样的程序:
程序1: dseg segment
...
dseg ends

cseg segment
assume cs:..,ds:..
start:mov ax,dseg ;设置段寄存器
mov ds,ax
...
cseg ends
end start

程序2: .data
...
.code
.startup
...
.exit
end


为什么程序2可以省去了设置段寄存器部分和assume部分
...全文
294 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
紫郢剑侠 2003-06-22
  • 打赏
  • 举报
回复
gz
Tranquillo 2003-06-21
  • 打赏
  • 举报
回复
386的DS、ES之类寄存器叫做段选择子,和16位下的段寄存器是有区别的
Areslee 2003-06-20
  • 打赏
  • 举报
回复
谁说保护模式下没有段寄存器?
用SOFTICE看过吗?
W32API 2003-06-20
  • 打赏
  • 举报
回复
你最好自己把程序编译,然后在反汇编,看看是不是都要装 段寄存器
junhli 2003-06-20
  • 打赏
  • 举报
回复
在没有用到与段寄存器值相关操作的情况下可以不定义段寄存器。tiny模式下四个段寄存器的初始值都是一样的。段寄存器的定义是根据需要来的,没有必要做多余的工作时,何必再多加代码量呢?
hswxf 2003-06-20
  • 打赏
  • 举报
回复
段定义是必要的,是CPU用来分类存放数据的标识的命令,在DOS下对一个程式可以分为四个地点(段)存放不同类型的数据(代码/数据/堆栈)
如果你用的是8086模式如你的程式1
如果是286以上模式如你的程式2
它都是由编译环境决定
Tranquillo 2003-06-19
  • 打赏
  • 举报
回复
这是两种不同的语法
前者是dos下16位的汇编
后者是32位的汇编
但是这并不仅仅是语法上的区别,而是因为8086和80386系统寻址机制的不同(或者说实模式和保护模式)。
在dos下,一个完整的程序设置段寄存器是必须的
而在保护模式下,没有段的逻辑概念,声明一个段,不过是声明一段连续的具有一定属性的内存区域
实际上80386以上CPU已经没有段寄存器这个编程结构了
123anmanny 2003-06-19
  • 打赏
  • 举报
回复
多谢各位
那么如果我的程序有多个data段就要用assume吗
zhukeke 2003-06-19
  • 打赏
  • 举报
回复

说程序2是简化的段定义伪操作并不贴切。应该说程序1是旧式的段定义模式,用于dos实模式,而程序2是新式的段定义模式,主要用于保护模式编程(当然也可以用于实模式)。
在保护模式下,段的属性必须在编译时明确指定,生成的.exe文件包含了每个段的保护属性,这样操作系统加载程序时就可以生成对应的段描述符。而这些在实模式下是不需要的。
由于新式的段定义模式已经定义了各个段,因此在不存在歧义的情况下(如程序没有定义两个.data段),是不需要运行时加载段值的(由操作系统默认)。
MagicianZ 2003-06-19
  • 打赏
  • 举报
回复
teal(茶茶)正确
spreadwide 2003-06-19
  • 打赏
  • 举报
回复
程序1 是完整的段定义伪操作,程序2 是简化段定义伪操作(较新版本的汇编程序MASM5.0和MASM6.0提供的新段定义方法),用简化段定义伪操作定义段时就不用写assume部分了。


设置段寄存器是必要的,因为ASSUME伪操作只是指定某个段分配给哪一个段寄存器,它并不能把段地址装入段积存器中,所以要在代码段中用MOV AX,***
MOV DS,AX 将段地址装入相应的段寄存器中。
zhukeke 2003-06-19
  • 打赏
  • 举报
回复

操作系统在加载程序时,给每个段寄存器都有规定的缺省值。因此,如果你的程序承认这个缺省值是不需要在程序中对段寄存器赋值的(当然赋了也没关系)。
程序2在.data语句中指定了ds的缺省值,从而也不需要对ds另外赋值和assume语句。
teal 2003-06-19
  • 打赏
  • 举报
回复
程序2中的 .data 关键字就是数据段,.code 就是代码段,碰到着这些关键字的时候,系统自动将其地址送到段寄存器中。因此在程序开始的时候无需在进行装段
在程序1中 segment 关键字仅是个段的定义,并不能表明段的类型,所以必须进行装段(将段的首地址装到寄存器里),如果在程序1中这样写
assume cs:dseg,ds cseg
mov ax,cseg
mov ds,ax
呵呵,系统则会把数据段当作代码段,把代码段当作数据段 …………^_^

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧