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中接受不到正确的结果.