首页
社区
课程
招聘
调试一个DOS程序遇到问题。
发表于: 2008-1-27 10:10 5894

调试一个DOS程序遇到问题。

qduwg 活跃值
35
2008-1-27 10:10
5894
很久没有来了,向各位问好啊!

为了研究16位程序的段组织结构情况,今天用Ida反汇编了一个16位的c程序,查看了一下各段信息,如下:

其中可用看到3个段,代码段,数据段,堆栈段。可是为什么IDA没有显示出CS和SS寄存器的内容?按理说DS跟SS的地址是不同的。可是下面就遇到相同的情况了。我被搞迷糊了!

用turbo debugger 调试此程序的时候,发现段ds寄存器,ss寄存器内容是一样的,也就是说原来程序内的堆栈段没有使用??而是跟数据段合用的?这是为什么?请高手解答一下!多谢!


我的问题是:为什么在IDA内看不到SS,CS寄存器内容?为什么在TD内看到的SS,DS都是在相同段内?按IDA的显示,应该在不同地址才对。

另外看不懂IDA反汇编的如下代码:
关于栈段的定义开始部分:
Uninitialized
120A:0000 seg002 segment byte stack 'STACK' use16
120A:0000 assume cs:seg002
120A:0000 assume es:nothing, ss:seg002, ds:dseg, fs:nothing, gs:nothing
120A:0000 byte_120A0 db 80h dup(0)
120A:0000 seg002 ends
这是栈的定义,不知为什么在堆栈定义区使用 assume cs:seg002,这个什么意思啊?
代码段的开始是:
; Segment type: Pure code
1000:0000 seg000 segment byte public 'CODE' use16
1000:0000 assume cs:seg000
1000:0000 assume es:nothing, ss:seg000, ds:nothing, fs:nothing, gs:nothing
1000:0000 ; 圹圹圹圹圹圹圹?S U B R O U T I N E 圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹?
1000:0000 ; Attributes: library function

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
2
也许与windows的vdm有关,你不是在真正的dos下运行的吧?
2008-1-27 11:43
0
雪    币: 475
活跃值: (1130)
能力值: ( LV9,RANK:1410 )
在线值:
发帖
回帖
粉丝
3
楼上老兄说的对啊,我不是在真正DOS下运行的。在XP下面运行的td,另外我用code viewer调试器也一样的结果。都是SS与DS相同。我的机器比较破,没有安装其他OS,只有XP。
2008-1-27 12:53
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
1222222222222
2008-1-27 13:00
0
雪    币: 475
活跃值: (1130)
能力值: ( LV9,RANK:1410 )
在线值:
发帖
回帖
粉丝
5
我刚才又进入纯DOS调试了一下,结果也是DS跟SS一样的值。为什么在程序里面看到有STACK段,但实际运行的时候,并没有给STACK寄存器SS赋值为设定的基地址呢?奇怪的问题啊。我对DOS程序不太属性。希望有高手指点一下啊!多谢啦。
2008-1-27 13:19
0
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
6
可能与C的编译模式有关,可以找找Turbo C或Borland C++的资料库,这里有一点:
http://www.edires.net/bbs/archiver/xml/topic/2263/index.aspx

我对这个也不了解,看过点dos下的TSR早忘光了
2008-1-27 19:59
0
雪    币: 475
活跃值: (1130)
能力值: ( LV9,RANK:1410 )
在线值:
发帖
回帖
粉丝
7
看了看你提供的资料,好像与编译模式没有关系啊。
2008-1-28 09:02
0
雪    币: 8209
活跃值: (4528)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
8
DOS程序的段寄存器是可以根据程序需要随意修改的
2008-1-28 09:15
0
雪    币: 475
活跃值: (1130)
能力值: ( LV9,RANK:1410 )
在线值:
发帖
回帖
粉丝
9
随意修改?那么程序内的SS段为什么不用?什么时候用到?
2008-1-28 12:23
0
雪    币: 8209
活跃值: (4528)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
10
从DOS的EXE文件头里看到的SS只是系统把它加载到内存时的初始值,程序自身可以一直使用这个默认值直到退出,程序自己也有权力随时把SS修改成自己喜欢的值。
2008-1-28 20:26
0
游客
登录 | 注册 方可回帖
返回
//