| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 9477 人关注过本帖, 1 人收藏
标题:[原创]深入讲解main()返回值问题
只看楼主 加入收藏
冰的热度
Rank: 2
等 级:禁止访问
威 望:5
帖 子:404
专家分:0
注 册:2006-12-2
收藏(1)
 问题点数:0 回复次数:41 
[原创]深入讲解main()返回值问题
*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国 http://www.bc-cn.net
*/ 作者: 冰的热度
*/ 时间: 2007-9-29 编程论坛首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------



前些天在论坛看到一贴,讨论main()函数的返回值,

有的说必须有返回值,如:return 0;

有的说没有也可以,如:用void修饰main()

但大家的讨论都只留于表面,现在我来试着讲解一下深层含义!

以下观点纯属个人观点,若有不当之处,望高手们不吝赐教

要想真正理解这个问题,首先要了解一下操作系统的外壳

操作系统是由多个功能模块组成的庞大,复杂的软件系统,任何通用的操作系统,都要提供一个称为shell(外壳)的程序,用户(操作人员)使用这个程序来操作计算机系统进行工作.
DOS中有一个程序command.com,这个程序在DOS中称为命令解释器,也就是DOS系统的shell.


用户的命令由command执行,首先command把程序加入内存,然后设置CPU的CS:IP指向程序的第一条指令(也就是程序入口,在C++中就是main()函数),从而使程序得以运行.程序结束后,返回到command中,CPU继续运行command.注意在返回的时候要有一个返回值,这样才能安全退出程序(注意我用的是退出一词),之后各寄存器会有恢复动作,如果没有返回值,虽然表面上看程序也正常结束了,但实际上它并没有退出,各寄存器并没有恢复,如CS:IP 还是指向程序尾部,如果得到CS:IP,那么可以让程序继续执行下去,但是所执行的程序已经不是你的代码所在的那段内存空间了,它在执行其它内存中的程序.

我先写这些吧,怎么样,明白了吗?

****************************************************
//第一次补充:

在C++中,如果是void main()的话,理论上说,应该不会正常结束,当然,这完全是我的猜测,

因为在汇编程序中,有int 21h的话,结束后会提示 Program terminated normally,

意思是程序正常结束,然后在用T或P命令,将没有指令执行,

如果没有int 21h这一句,就不会有这个提示,也就是说程序没有正常结束,

此时用T或P命令,CS:IP将指向下一条指令,并执行.

类比一下,C++中也应该是这样,
用int main()
{
......
return 0;
}的话会正常结束,

用void main()的话,虽然也能结束,但似乎会有潜在的问题.

******************************************************

[此贴子已经被作者于2007-10-3 21:11:25编辑过]

搜索更多相关主题的帖子: main 返回值 讲解 
2007-09-29 17:58
野比
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:1627
专家分:516
注 册:2007-5-24
收藏
得分:0 
有个地方:程序结束后,返回到command中
这里没有讲好,是这样的,程序结束后,CS:IP指向command.com进入用户程序前的下一条语句(最后一条语句是“然后设置CPU的CS:IP指向程序的第一条指令”)
此时,command.com从stack里弹出(pop)2或4字节的内容,这些内容就是用户程序的返回值。
没有返回值就是0,所以编写正常的main就算是void型的也可以照常退回dos。

再好好修改扩展一下,写好点加精。

女侠,约吗?
2007-09-29 19:22
冰的热度
Rank: 2
等 级:禁止访问
威 望:5
帖 子:404
专家分:0
注 册:2006-12-2
收藏
得分:0 
有更新,请看原贴下的补充!

科学是永恒之迷...... 我的博客http://blog..cn/u/1267727974 阅读我的blog,懂与不懂都是收获!
2007-09-29 20:39
栖柏
Rank: 2
等 级:论坛游民
威 望:3
帖 子:1103
专家分:17
注 册:2007-8-23
收藏
得分:0 

因为在汇编程序中,有int 21h的话,结束后会提示 Program terminated normally,

意思是程序正常结束,然后在用T或P命令,将没有指令执行,


在dos下用会出现的非正常终止,如果是直接在windows下运行.exe文件就不会显示
不过我有个问题,你的汇编的程序中有ret么?
如二楼,保存现场
不知道正常退出和非正常退出
请参考return和exit


You have lots more to work on! Never give up!c language!
2007-09-29 20:58
china25qd
Rank: 1
等 级:新手上路
帖 子:161
专家分:0
注 册:2007-9-6
收藏
得分:0 
不是所有的main()都能返回"0"的
我比较喜欢main(数据类型 e)
...
return e;

抱膝怀天下 闲坐观四海
2007-09-29 21:24
栖柏
Rank: 2
等 级:论坛游民
威 望:3
帖 子:1103
专家分:17
注 册:2007-8-23
收藏
得分:0 
楼上能具体举个例子么?我还不知道,想学习

You have lots more to work on! Never give up!c language!
2007-09-29 21:46
野比
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:1627
专家分:516
注 册:2007-5-24
收藏
得分:0 

MOV AH,4CH
INT 21H



RET

是等价的,只是INT不会PUSH, RET和RETF会


女侠,约吗?
2007-09-30 13:56
miyayaya
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2007-9-29
收藏
得分:0 
嗯嗯,学习了

LZ跟野比两位辛苦了

2007-09-30 16:53
冰的热度
Rank: 2
等 级:禁止访问
威 望:5
帖 子:404
专家分:0
注 册:2006-12-2
收藏
得分:0 
回复:(miyayaya)嗯嗯,学习了LZ跟野比两位辛苦了...
请问 LZ 是谁呀?

科学是永恒之迷...... 我的博客http://blog..cn/u/1267727974 阅读我的blog,懂与不懂都是收获!
2007-09-30 17:49
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:0 
说了=没说
2007-09-30 23:14
快速回复:[原创]深入讲解main()返回值问题
数据加载中...
 
   



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

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