| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 906 人关注过本帖
标题:TonyDeng版主帮帮忙呗。。。。。我真的走火入魔了。。。。
取消只看楼主 加入收藏
suishuhao
Rank: 2
等 级:论坛游民
帖 子:89
专家分:10
注 册:2012-9-25
结帖率:61.9%
收藏
已结贴  问题点数:10 回复次数:4 
TonyDeng版主帮帮忙呗。。。。。我真的走火入魔了。。。。
我在百度文库中看到C语言编译过程详解:
http://wenku.baidu.com/view/8976aeb765ce05087632130a.html

其中讲到:编译后的目标文件OBJ由段组成。通常一个目标文件中至少有两个段:
 1) 代码段:该段中所包含的主要是程序的指令。该段一般是可读和可执行的,但一般却不可写。
 2) 数据段:主要存放程序中要用到的各种全局变量或静态的数据。一般数据段都是可读,可写,可执行的。

那么我想问:
1.编译后的目标文件OBJ的结构是像汇编程序那样,由段组成的吗?(照文中的意思,编译后的OBJ是分段形式的,应该由段组成)。
2.编译后的obj文件有没有堆段、栈段????

还有:全局变量在编译完毕后,其在data area区的逻辑地址(段地址:偏移量)是固定不变的,
从逻辑地址这个角度来说,全局变量的内存地址是不变的。









[ 本帖最后由 suishuhao 于 2013-2-22 12:01 编辑 ]
搜索更多相关主题的帖子: C语言 走火入魔 百度文库 
2013-02-22 11:22
suishuhao
Rank: 2
等 级:论坛游民
帖 子:89
专家分:10
注 册:2012-9-25
收藏
得分:0 
以下是引用TonyDeng在2013-2-22 12:38:14的发言:

转引这个给你参考吧:

----------------------------------------
Win32的汇编源程序中,包含全部段的源程序结构如下:
 
.386
.model flat,stdcall
option casemap:none
    <一些include语句>
.stack [堆栈段的大小]
 
.data
    <一些初始化过的变量定义>
.data?
    <一些没有初始化过的变量定义>
.const
    <一些常量定义>
.code
    <代码>
    <开始标号>
        <其他语句>
end 开始标号
 
 

.stack,.data,.data?,.const和 .code是分段伪指令.

Win32中实际上只有代码和数据之分

      .data,.data?和 .co.nst是数据段.

      .code是代码段.

      .stack段定义常常被忽略

       因为和DOS汇编不同,Win32汇编不必考虑堆栈,系统会为程序分配一个向下扩展的、足够大的段作为堆栈段.

 

不是说过Win32环境下不用段了吗?

是的,这些“段”实际上并不是DOS汇编中那种意义的段,而是内存的“分段”。

上一个段的结束就是下一个段的开始,所有的“分段”合起来,包括系统使用的地址空间,就组成了整个可以寻址的4 GB空间。

Win32环境的内存管理使用了80386处理器的分页机制,每个页(4 KB大小)可以自由指定属性,所以上一个4 KB可能是代码,属性是可执行但不可写,下一个4 KB就有可能是既可读也可写但不可执行的数据,再下面呢?有可能是可读不可写也不可执行的数据。

Win32汇编源程序中“分段”的概念实际上是把不同类型的数据或代码归类,再放到不同属性的内存页(也就是不同的“分段”)中,这中间不涉及使用不同的段选择器。

虽然使用和DOS汇编同样的 .code和 .data语句来定义,意思可是完全不同了!

 

数据段

===========

.data,.data?和 .const定义的是数据段,分别对应不同方式的数据定义,在最后生成的可执行文件中也分别放在不同的节区(Section)中。

程序中的数据定义一般可以归纳为3类:
1.可读可写的已定义变量。这些数据必须定义在 .data段中,.data段是已初始化数据段,其中定义的数据是可读可写的,在程序装入完成的时候,这些值就已经在内存中了,.data段存放在可执行文件的_DATA节区内。
2.可读可写的未定义变量。这些变量一般是当做缓冲区或者在程序执行后才开始使用的,这些数据可以定义在 .data段中,也可以定义在 .data?段中,但一般把它放到 .data?段中。虽然定义在这两种段中都可以正常使用,但定义在 .data?段中不会增大 .exe文件的大小。

举例说明,如果要用到一个100 KB的缓冲区,可以在数据段中定义:

szBuffer db 100 * 1024 dup (?)

如果放在 .data段中,编译器认为这些数据在程序装入时就必须有效,所以它在生成可执行文件的时候保留了所有的100 KB的内容,即使它们是全零!如果程序其他部分的大小是50 KB,那么最后的 .exe文件就会是150 KB大小,如果缓冲区定义为1 MB,那么 .exe文件会增大到1 050 KB。.data?段则不同,其中的内容编译器会认为程序在开始执行后才会用到,所以在生成可执行文件的时候只保留了大小信息,不会为它浪费磁盘空间。和上面同样的情况下,即使缓冲区定义为1 MB,可执行文件同样只有50 KB!总之,.data?段是未初始化数据段,其中的数据也是可读可写的,但在可执行文件中不占空间,.data?段在可执行文件中存放在_BSS节区中
3.常量。如一些要显示的字符串信息,它们在程序装入的时候也已经有效,但在整个执行过程中不需要修改,这些数据可以放在 .const段中,.const段是常量段,它是可读不可写的。一般为了方便起见,在小程序中常常把常量一起定义到 .data段中,而不另外定义一个 .const段。在程序中如果不小心写了对 .const段中的数据做写操作的指令,会引起保护错误.

如果不怕程序可读性不佳的话,把 .const段中定义的东西混到 .code段中去也可以正常使用,因为 .code段也是可以读的。

代码段

============

.code段是代码段,所有的指令都必须写在代码段中,在可执行文件中,代码段是放在_TEXT节区中的。

Win32环境中的数据段是不可执行的,只有代码段有可执行的属性。对于工作在特权级3的应用程序来说,.code段是不可写的.

当然事物总有两面性,在Windows 95下,在特权级0下运行的程序对所有的段都有读写的权利,包括代码段。另外,在优先级3下运行的程序也不是一定不能写代码段,代码段的属性是由可执行文件PE头部中的属性位决定的,通过编辑磁盘上的 .exe文件,把代码段属性位改成可写,那么在程序中就允许修改自己的代码段。

 

摘自 作者:罗云彬
非常感谢你哇~~~~~
2013-02-22 13:02
suishuhao
Rank: 2
等 级:论坛游民
帖 子:89
专家分:10
注 册:2012-9-25
收藏
得分:0 
以下是引用TonyDeng在2013-2-22 13:09:12的发言:

现在你明白为什么不需要深究这些东西了吗?
谢谢你了,不深追究了。
2013-02-22 13:42
suishuhao
Rank: 2
等 级:论坛游民
帖 子:89
专家分:10
注 册:2012-9-25
收藏
得分:0 
我在百度上问了问,得到如下答复:
1、是,obj文件里面有段信息2、没有,堆是运行的时候由运行库给你分配的(windows下vc运行库其实用的是系统提供的堆),栈式运行的时候系统给你分配的,编译后的obj里面甚至连栈段有多大这样的信息都没有(这是链接的时候加上去的)全局变量的逻辑地址是不变的这说法在没开启动态基地址的时候是正确的,每次exe加载到内存中以后,同一个全局变量都在同一个位置。不过windows下开启动态基地址之后每次exe都可能被加载到不同的地址上,这个时候全局变量的内存地址就会变化了。
2013-02-22 16:33
suishuhao
Rank: 2
等 级:论坛游民
帖 子:89
专家分:10
注 册:2012-9-25
收藏
得分:0 
以下是引用lwb603569640在2013-2-22 16:49:09的发言:

推荐一本书   
 
http://ishare.iask.
谢谢!看看~
2013-02-22 16:55
快速回复:TonyDeng版主帮帮忙呗。。。。。我真的走火入魔了。。。。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033536 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved