实验一 程序的机器级表示
一、实验目的
1.掌握高级语言源程序和目标机器代码的不同表示及其相互转换。 2.深刻理解高级语言和机器语言之间的关系。 3.掌握子程序设计的思想、方法及上机调试过程。 4.理解中断服务子程序的执行过程。
二、实验准备知识
1.IA-32中过程调用和返回指令的格式和功能。 2.子程序设计的思想和方法
(1)子程序是功能相对独立的程序段,它可以实现源程序的模块化,简化源程序结构,提高编程效率
(2)子程序定义:利用过程伪指令PROC和ENDP,格式如下: 过程名
PROC [NEAR|FAR]
;过程体
……
ENDP
过程名
其中:可选的参数指定过程的调用属性。没有指定过程属性,则采用默认属性NEAR。
NEAR属性:段内近调用,子程序只能被相同代码段的其他程序调用 FAR属性:段间远调用,子程序可以被相同或不同代码段的程序调用 (3)主程序(调用程序)调用子程序(被调用程序):利用CALL指令 (4)子程序返回主程序:利用RET指令
(5)保护现场:子程序开始处应该保护子程序中使用的寄存器(通常利
用堆栈),子程序返回前相应进行恢复。
(6)子程序中对堆栈的压入和弹出操作通常成对使用,以保持堆栈的平衡。
(7)子程序允许嵌套和递归
(8)处理好子程序与主程序之间的参数传递问题:利用寄存器、内存缓冲区及堆栈。
3.过程调用的执行步骤(假设P为调用者,Q为被调用者): (1)P保存现场(必要时);
(2)将入口参数(实参)放到Q能访问到的地方; (3)P保存返回地址,然后将控制转移到Q;
(4)Q保存P的现场,并为自己的非静态局部变量分配空间; (5)执行Q的过程体(函数体);
(6)Q恢复P的现场,释放局部变量空间; (7)Q取出返回地址,将控制转移到P。 4. Linux常用命令以及GCC编译器的使用命令。
三、实验性质
本实验为验证性实验。
四、实验学时
本实验学时为4学时。
五、实验内容及步骤
1 .用C语言编写一个完整的源程序,实现main函数调用一个子函数的功能。
2.在终端使用gcc编译器编译源程序,生成汇编文件并查看,分析汇编指令与C源程序的对应关系。
3.对汇编文件进行汇编,生成可重定位目标文件。 4.对目标文件进行链接,生成可执行文件。
5.对可执行文件进行反汇编,分析汇编指令与源文件语句的关系,找到主程序所对应的指令代码。
六、实验要求
1.实验前要做好充分准备,包括程序框图,源程序清单,调试步骤,调试方法,以及对程序结果的分析等。
2.独立完成,严禁抄袭。 3.学会解决调试过程中的错误。
七、实验报告内容
1.画出程序框图,写出源程序清单及在Linux操作系统中运行程序的过程。
2.写出程序执行过程中遇到的问题是如何解决的,并对执行过程中的问题进行分析。
3.给出GCC的命令及运行结果截图,并对执行结果进行分析。 4.收获及体会。