在以下C程序中_AX = 1000的含义是什么?

时间:2013-07-18 11:08:40

标签: c function

我是C编程语言的初学者,最近我开始学习函数,我研究过函数使用关键字返回来返回中的值来电功能。例如以下程序。

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 个答案:

答案 0 :(得分:24)

“返回值”在特定寄存器中返回(由“ABI”定义,应用程序二进制接口,描述编译器应如何生成其代码),在大多数x86系统中,即EAX(32位)或AX(16位)[不是说_AX内部实际上不是EAX]。

这个编译器显然支持通过命名它来直接使用“寄存器”_AX。因此,通过使用值加载[E] AX寄存器,我们基本上返回此值。

这绝对不适用于任何其他编译器,尽管内联汇编程序可以实现同样的目的。

答案 1 :(得分:11)

在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。然后将薪水值移至AH,然后发送至视频内存。

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

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

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

答案 2 :(得分:7)

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

_AX = 1000;

表示您将值1000置于累加器中,当函数完成执行并且控件到达调用者函数时,则检查累加器的值,在这种情况下,该值将存储在x中。

这里的陈述

x = get_val();

只是

x = 1000;

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

答案 3 :(得分:0)

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