20

我是C语言的初学者,最近开始学习函数,研究了函数在调用函数中使用return关键字返回值。例如下面的程序。

int getVal(){
 return 1000;
}

int main(){
int x = getVal();
printf("x = %d",x);
return 0;
}

将打印x = 1000

但我很困惑(在 turbo C 编译器 32 位下)为什么下面的程序也会产生x = 1000的输出。请解释。

int get_val(){
 _AX = 1000;
}

int main(){
int x = get_val();
printf("x = %d",x);
return 0;
}
4

4 回答 4

26

在大多数 x86 系统中,即 EAX(32 位)或 AX(16位)[不是说 _AX 实际上不是内部的 EAX]。

这个编译器显然支持直接使用“寄存器”,将其命名为 _AX。因此,通过向 [E]AX 寄存器加载一个值,我们实际上是在返回这个值。

这绝对不会在任何其他编译器中工作,尽管内联汇编器可以实现同样的事情。

于 2013-07-18T11:18:19.897 回答
13

在这里的 C 中,_AX 是一个伪寄存器。当你这样做时AX=1000,这个值1000取自累加器

但它可能无法在 GCC 编译器中按预期工作

在 Turbo C 中编译并运行以下程序,您将得到 35 作为输出。它可能不适用于其他编译器。

#include<stdio.h>  
int main()  
{
    int a = 0;  
    a = 35;  
    printf("%d");  
    return 0;
}  

假设a的地址=1200。假设显存地址=5500;

MOV AH, 35  
MOV [1200], AH  
MOV [5500], AH // prints on the screen.  

这就是执行发生的方式。将值 35 复制到位置 1200 后,AH 保留值 35。

然后printf("%d")尝试从 AH 中获取值并发送到显存以将其显示在屏幕上。

如果我们使用printf("%d %d", age, salary),则在使用该值发送到显存之前将年龄的值传输到 AH。然后将salary 的值移动到AH,然后发送到显存。

假设,年龄地址 = 1200;工资地址= 1202;显存地址 = XXXX;(它会根据屏幕上打印的字符数而变化,不要过多考虑这个地址值)

MOV AH, [1200]
MOV [XXXX], AH
MOV AH, [1202]
MOV [XXXX], AH

我希望这将有助于理解给定程序的解决方案。

于 2013-07-18T11:11:31.993 回答
6

根据 TC 编译器(32 位),函数的返回值存储在累加器(AC)中,并且可以在 TC 编译器中使用 _AX 访问它,所以当您编写时:

_AX = 1000;

表示您将值 1000 放入 Accumulator 中,当函数完成执行并且控制到达调用者函数时,会检查 Accumulator 的值,在这种情况下,该值将存储在 x 中。

这里的声明

x = get_val();

会很简单

x = 1000;

但这仅适用于您的情况,意味着在(TC 32 位 Windows 编译器)中,它可能适用于其他编译器,也可能不适用于其他编译器。

于 2013-07-18T11:39:56.310 回答
0

在 getval() 中,1000 存储在累加器中,getval() 将给出编译时警告函数应该返回一个值,然后在 main 中,x 将被分配返回或存储在累加器中的值 1000,这就是为什么它将打印 x=1000。

于 2017-07-10T13:39:39.587 回答