| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 906 人关注过本帖
标题:TonyDeng版主帮帮忙呗。。。。。我真的走火入魔了。。。。
只看楼主 加入收藏
suishuhao
Rank: 2
等 级:论坛游民
帖 子:89
专家分:10
注 册:2012-9-25
结帖率:61.9%
收藏
已结贴  问题点数:10 回复次数:19 
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
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:2 
我替Tony版主接分来了
2013-02-22 11:40
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:2 
首先,我不是版主。小Z才是。2楼回答问题才有分!

授人以渔,不授人以鱼。
2013-02-22 11:44
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用TonyDeng在2013-2-22&nbsp;11:44:28的发言:<br>首先,我不是版主。小Z才是。2楼回答问题才有分!
图片附件: 游客没有浏览图片的权限,请 登录注册
2013-02-22 11:51
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
抬头看看名单嘛。这个东西是z版的专长,快来解答,我把分给你好了。

授人以渔,不授人以鱼。
2013-02-22 11:58
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
给你看一个图,然后由z版给你解释一下汇编中的段跟这个有什么不同。
图片附件: 游客没有浏览图片的权限,请 登录注册

授人以渔,不授人以鱼。
2013-02-22 12:01
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
转引这个给你参考吧:

----------------------------------------
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文件,把代码段属性位改成可写,那么在程序中就允许修改自己的代码段。

 

摘自<Win32汇编教程> 作者:罗云彬
收到的鲜花
  • suishuhao2013-02-22 12:51 送鲜花  3朵   附言:好文章

授人以渔,不授人以鱼。
2013-02-22 12:38
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
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
现在你明白为什么不需要深究这些东西了吗?

授人以渔,不授人以鱼。
2013-02-22 13:09
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:2 
学习受教了...

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-02-22 13:09
快速回复:TonyDeng版主帮帮忙呗。。。。。我真的走火入魔了。。。。
数据加载中...
 
   



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

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