研究实验二 使用寄存器
实验内容
研究在C语言中寄存器使用的一些问题,以及对main函数的一些初步理解。
实验环境
win7 、DOSBox、TC2.0
实验步骤
1. 编写程序ur1.c,编译、连接,生成ur1.exe。
2. 用Debug加载ur1.exe,用u命令查看ur1.c编译后的机器码和汇编代码。
如果直接用u查看会发现如下情况:
这与我们预期的是不一样的,因为程序是从main函数开始执行的,所以得先知道main函数在代码段中的偏移地址。
3. 用下面的程序打印出main函数在代码段中的偏移地址。
可以看到main函数的偏移地址是1fa
4. 根据步骤3得到的偏移地址,用u命令查看ur1.exe中的机器代码和汇编代码。
可以看到076A:01FD开始,所对应的就是编译、连接之后ur1.exe文件对应的机器代码和汇编代码。
这里提出的问题是:汇编代码开始处的“push bp mov bp,sp”和结尾处的”pop bp”怎么理解。
这是因为main函数也相当于汇编中的一个子程序,要在调用子程序时将栈顶位置保存,以便于程序能正确返回,但是栈顶指针sp不能当作偏移地址移动,所以要将sp赋给bp。
5. 因为main函数后面有ret指令,以及对于上面问题的回答,要进一步验证我们的设想,编写程序ur2.c。
查看它的代码
可以看到,在调用f()函数时,即调用子程序时与1fa处一样,和main函数返回一样,所以可以得到main函数在汇编中确实是被当作子程序来处理的。
总结
编写C语言程序,查看对寄存器的使用,在实验过程中发现对main函数的一些问题,通过观察汇编代码及编写另外的含有子程序的代码,得出main函数在汇编中是作为子程序被调用的,通过Debug加载程序,u命令查看机器代码和汇编代码,更直接的看到了程序对寄存器的使用。