我是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; }
在大多数x86系统中,“返回值”在特定寄存器中返回(由“ABI”定义,应用程序二进制接口,描述编译器应如何生成其代码),即EAX(32位)或AX(16) bit)[不是说_AX内部实际上不是EAX]。
这个编译器显然支持通过命名它来直接使用“寄存器”_AX。 因此,通过使用值加载[E] AX寄存器,我们基本上返回此值。
这绝对不会在任何其他编译器中工作,尽管内联汇编程序可以实现相同的function。
在C中,_AX是伪寄存器。 当你做AX=1000
,这个值1000
来自累加器
但它可能无法在GCC编译器中按预期工作
在Turbo C中编译并运行以下程序,您将获得35作为输出。 它可能在其他编译器中不起作用。
#include int main() { int a = 0; a = 35; printf("%d"); return 0; }
假设a = 1200的地址。假设video存储器的地址= 5500;
MOV AH, 35 MOV [1200], AH MOV [5500], AH // prints on the screen.
这是执行的方式。 在将值35复制到位置1200之后,AH保留值35。
然后printf("%d")
尝试从AH获取值并发送到video内存以在屏幕上显示它。
如果我们使用printf("%d %d", age, salary)
,在使用该值发送到video内存之前,年龄值会转移到AH。 然后将薪水值移至AH,然后发送至video内存。
假设,年龄地址= 1200; 工资地址= 1202; video内存地址= XXXX; (它会根据屏幕上打印的字符数改变,不要太在意这个地址值)
MOV AH, [1200] MOV [XXXX], AH MOV AH, [1202] MOV [XXXX], AH
我希望这有助于理解给定程序的解决方案。
根据TC编译器(32位),函数的返回值存储在累加器(AC)中,可以使用_AX在TC编译器中访问,所以当你写:
_AX = 1000;
表示您将值1000置于累加器中,当函数完成其执行并且控件到达调用函数时,则检查累加器的值,在这种情况下,该值将存储在x中。
这里的声明
x = get_val();
简直就是这样
x = 1000;
但这只是在你的情况下,意味着(TC 32位Windows编译器),它可能或可能不适用于其他编译器。
在getval()中,1000存储在累加器中,而getval()将给出编译时警告该函数应该返回一个值,然后在main中,x将被赋值返回或存储在累加器中的值1000,这就是为什么它将打印x = 1000。
需要了解更多c/c++开发分享在以下C程序中_AX = 1000的含义是什么?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享在以下C程序中_AX = 1000的含义是什么?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/980343.html