| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1778 人关注过本帖
标题:我错了还是老师错了?
只看楼主 加入收藏
aoaoaoao
Rank: 1
等 级:新手上路
帖 子:81
专家分:0
注 册:2007-5-14
收藏
得分:0 

1 在tc16位dos程序下myadd函数的返回值是放在ax累加器中;

当你在计算sum=*a + *b;的时候,
*a和*b的和被存入在ax中,然后才被送入在堆栈中为sum开辟的空间中,也就是给sum赋值;

如果你没有return的时候 ax的值就是*a和*b的和;
如果有return sum的时候 ax被送入sum 的值,同样还是*a和*b的和;
所以你写不写return sum;ax中的内容都是sum的值;

你如果在sum=*a + *b;后添加了一条改变ax内容的指令 那么你不加return的时候ax的内容已经不再是*a和*b的和,z就接受了不正确的值

例如 myadd (int *a,int *b)
{ int sum,i;
sum=*b + *a;
i=*b+*a+*a;
}
i=*b+*a+*a;后ax的值已经被修改成为*b+*a+*a的和,所以函数返回后z就会接受*b+*a+*a的和;

2 当从函数myadd中返回main中的过程,ax寄存器的值是没有改变的.


3 myadd (int *a,int *b)这个函数的默认返回值是int型;
说明 这个函数是有返回值的,而返回值就在ax中;

同时在解释ax中的内容的时候是按int类型来解释的

你所声明的Z的值是int类型的 所以能够正确接受ax中被解释为int类型的值;

4 编译器不同 对待有返回值却不加return的方式是不同的;还有在生成指令的方式也是不同的;有的ax或eax中的值就不一定是*a+*b的和,所以z从ax或eax中接受不到正确的结果.









2007-08-05 14:33
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
收藏
得分:0 
楼上强大

2007-08-05 14:43
快速回复:我错了还是老师错了?
数据加载中...
 
   



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

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