社区
汇编语言
帖子详情
设置段寄存器是必须的吗
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
打赏
收藏
设置段寄存器是必须的吗
两个一样的程序: 程序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部分
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
呵呵,系统则会把数据段当作代码段,把代码段当作数据段 …………^_^
C语言位操作视频精讲-C语言专题第二部分
本课程的目标是让大家彻底掌握C语言中位运算符及常规技巧,这些知识在嵌入式代码中用的很多,尤其是
设置
寄存器以操控硬件时,很多同学被卡在这里。
03.
段寄存器
段寄存器
是因为对内存的分段管理而
设置
的。计算机需要对内存分段,以分配给不同的程序使用。在描述内存分段时,需要有如下段的信息:1.段的大小;2.段的起始地址;3.段的管理属性(禁止写入/禁止执行/系统专用等)。需要用8个字节(64位)存储这些信息,但
段寄存器
只有16位,因此
段寄存器
中只能存储段号(segment selector,也译作“段选择符”),再由段号映射到存在内存中的GDT(global (segment) descriptor table,全局段号记录表),读取段的信息。
段寄存器
含义
段寄存器
是因为对内存的分段管理而
设置
的。16位CPU有四个16位
段寄存器
,所以,其程序可同时访问四个不同含义的段。
段寄存器
CS指向存放程序的内存段,IP是用来存放下条待执行的指令在该段的偏移量,把它们合在一起可在该内存段内取到下次要执行的指令。
段寄存器
SS指向用于堆栈的内存段,SP是用来指向该堆栈的栈顶,把它们合在一起可访问栈顶单元。另外,当偏移量用到了指针寄存器BP,
汇编:CPU结构 -
段寄存器
8086在访问内存时要由相关部件提供内存单元的段地址和偏移地址,送入地址加法器合成物理地址。 是什么部件提供段地址? 段地址在8086的
段寄存器
中存放。 8086有4个
段寄存器
:CS、DS、SS、ES,当CPU需要访问内存时由这4个
段寄存器
提供内存单元的段地址: CS (Code Segment):代码
段寄存器
DS (Data Segment):数据
段寄存器
SS (Stack Segment):堆栈
段寄存器
ES (Extra Segment):附加段..
段寄存器
和段基址
段寄存器
是因为对内存的分段管理而
设置
的。计算机需要对内存分段,以分配给不同的程序使用(类似于硬盘分页)。在描述内存分段时,需要有如下段的信息:1.段的大小;2.段的起始地址;3.段的管理属性(禁止写入/禁止执行/系统专用等)。需要用8个字节(64位)存储这些信息,但
段寄存器
只有16位,因此
段寄存器
中只能存储段号(segment selector,也译作“段选择符”),再由段号映射到存在内存中的GD
汇编语言
21,458
社区成员
41,603
社区内容
发帖
与我相关
我的任务
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
分享
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章