首页
社区
课程
招聘
[求助]16位汇编 有个很菜的问题想请大家帮忙
发表于: 2015-1-1 20:58 4358

[求助]16位汇编 有个很菜的问题想请大家帮忙

2015-1-1 20:58
4358
最近学16位汇编 有个问题想不通,网上查了一天也没查到什么

我用nasm编译的

关于汇编中的段,比如代码段,数据段,在编程的时候用section 定义的,
我想不通的是,这个段与ds,cs 是什么区别,
是不是定义了代码段,数据段后,cs,ds 的初始值就是所定义的值

如果不是这个,那是不是 段的定义 只是为了 把程序在 内存中人为的分段, 程序加载到内存后就不连续了,而是按照定义的段 分多个块

我看到一个程序是 有两个代码段

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 719
活跃值: (777)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
2
Windows程序默认平坦模式。段的定位比较模糊。
2015-1-1 21:11
0
雪    币: 88
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我说的是16位 实模式
2015-1-1 21:27
0
雪    币: 398
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
16位下,段寄存器将代码与数据分开,还有堆栈也分开的,分段的目的,一方面是为了将数据与代码分开,另一方面是为了扩展寻址空间;
2015-1-1 22:03
0
雪    币: 88
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这我也知道啊!!
2015-1-1 22:31
0
雪    币: 807
活跃值: (2293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
任何16位程序在内存中一定是连续的,代码段和堆栈段不用赋值,系统会自动确定,数据段必须要赋值。其实,内存分段没有那么神秘,DOS程序可用的内存是20位的地址,范围:00000H-FFFFFH,而实际寻址是16位的,所以,就必须用段+偏移的方式来寻址,应该懂得变通。例如:内存地址40:0000其20位内存地址为00400H,可以变通为0000:0400,0000:7C00其20位内存地址为07C00H,可以变通为07C0:0000。可以看出,20位内存地址 = 段地址 x 10H + 偏移。
2015-1-1 23:05
0
雪    币: 201
活跃值: (62)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
汇编产生的EXE文件是以节为单位(16字节/节)进行的,在源文件里定义的每个段在编译后都占有整数个节,不足的部分会补充为00H,保证个段节对齐。数据段、堆栈段、代码段构成的节一起统称装入模块,装入时各个段寄存器和IP、SP都由dos加载器根据EXE文件头(用于描述 一些文件的信息,包括如何重定位)进行重新定位,源程序中的定义的各段在装入内存时也是连续的。
可以参考
http://bbs.pediy.com/showthread.php?t=77208&highlight=%E8%AF%BB%E4%B9%A6+%E4%B9%A6%E7%AC%94+%E7%AC%94%E8%AE%B0+%E9%87%8D%E5%AE%9A+%E5%AE%9A%E4%BD%8D
2015-1-2 16:44
0
游客
登录 | 注册 方可回帖
返回
//