实验4 汇编应用编程和c语言程序反汇编分析

一、实验目的

1. 理解80×25彩色字符模式显示原理

2. 理解转移指令jmp, loop, jcxz的跳转原理,掌握使用其实现分支和循环的用法

3. 理解转移指令call, ret, retf的跳转原理,掌握组合使用call和ret/retf编写汇编子程序的方法,掌握 参数传递方式

4. 理解标志寄存器的作用

5. 理解条件转移指令je, jz, ja, jb, jg, jl等的跳转原理,掌握组合使用汇编指令cmp和条件转移指令实 现分支和循环的用法

6. 了解在visual studio/Xcode等环境或利用gcc命令行参数反汇编c语言程序的方法,理解编译器生成 的反汇编代码

7. 综合应用寻址方式和汇编指令完成应用编程

二、实验准备

实验前,请复习/学习教材以下内容:

第 9章  转移指令的原理

第10章  call和ret指令

第11章  标志寄存器

三、实验内容

1.实验任务一

编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'welcome to masm!'。

2.实验任务二

编写子程序printStr,实现以指定颜色在屏幕上输出字符串。调用它,完成字符串输出。使用任意文本编辑器,录入汇编源程序program2.asm。汇编、运行程序,观察运行结果。

对源程序做如下修改:

把line3改为:str db 'another try',0

把line12改为:mov al,4

再次汇编,运行程序,观察运行结果。

基于运行结果,理解源代码,以及组合使用转移指令call和ret实现子程序的原理与方法。具体地,在 line18-40中: line19-22, line36-39,这组对称使用的push、pop,这样用的目的是什么? line30的功能是什么?

3.实验任务三

使用任意文本编辑器,录入汇编源程序program3.asm,阅读源代码,理解子程序num2str的汇编实现。

子任务1

对program3.asm进行汇编、链接,得到可执行程序后,在debug中使用u命令反汇编,使用g命令执行 到line15(程序退出之前),使用d命令查看数据段内容,观察是否把转换后的数字字符串'1984'存放 在数据段中str标号后面的单元。

子任务2

对program3.asm源代码进行修改、完善,把program2.asm中用于输出以0结尾的字符串的子程序加进来, 实现对转换后的字符串进行输出。

子任务3

把program3.asm源代码中,line3中整数改成0~2559之间的任意数值,运行测试,观察结果。

4.实验任务4

使用任意文本编辑器,录入汇编源程序task4.asm。汇编、链接、运行程序,输入一个字符串并以#结束(比如,2020, bye#)观察运行结果.。

结合运行结果,理解程序功能,了解软中断指令。具体地:

line12-19实现的功能是?

line21-27实现的功能是?

5.实验任务5

在visual studio集成环境中,编写一个简单的包含有函数调用的c程序。在line7, line13分别设置断点,在调试模式下,查看反汇编代码。 分析反汇编代码,从汇编的角度,观察高级语言中参数传递和返回值是通过什么实现的,以及参数入栈顺序,返回值的带回方式等。

四、实验结论

1.实验任务1

源程序:

运行结果截图:

2.实验任务2

源程序:

 

运行结果截图:

修改后的源程序:

修改后运行结果截图:

说明:

1.line19-22, line36-39,这组对称使用的push、pop,这样用的目的是什么?

答:更好地利用寄存空间,保护和恢复各寄存器的值。

2.line30的功能是什么?

答:将字符以及颜色属性输入到指定显存中。

3.实验任务3

子任务1

program3源程序:

使用u命令反汇编,g命令执行到程序退出前,d命令查看数据段内容:

子任务2:

修改后的program3源程序:

修改后运行结果截图:

子任务3

line3整数改为666后program3源程序:

运行结果截图:

4.实验任务4

源代码:

运行结果截图:

说明:

1.line12-19实现的功能是?

答:利用中断指令和条件跳转指令,判断输入字符是否为“#”,若不是“#”则读入并将其保存在栈内。

2.line21-27实现的功能是?

答:利用循环指令,依次输出保存在栈内的字符。

5.实验任务5

设置断点:

 

反汇编:

说明:

分析反汇编代码,从汇编的角度,观察高级语言中参数传递和返回值是通过什么实现的,以及参数入 栈顺序,返回值的带回方式?

通过查阅相关资料得知:在主函数main内,首先进行初始化操作,将默认堆栈寄存器压入栈。接着进行变量声明,若变量有初值,则反汇编会生成一条 Mov指令为其赋值,对于没有初值的变量其每个字节都为0xCCH;调用函数时,先借助寄存器,将参数b 的地址压入堆栈寄存器eax,再将参数a 的值压入堆栈寄存器ecx。实现了实参赋值给形参,通过 call 指令调用函数sum;sum函数内同样先初始化并分配栈空间,执行得到的结果保存在eax寄存器内,调用ret指令返回;执行完毕后,返回主函数main,再将eax值赋值给参数c。主调函数根据压入堆栈参数的数目 2 和参数的大小,利用指令 add ESP,将参数全部弹出。此时堆栈就恢复到其调用前的状态。

五、实验总结

1.初次接触利用高级语言反汇编,开拓了固有的知识体系。

2.巩固了利用显存区域打印输出的知识点。

posted @ 2020-12-14 23:34  LS8029  阅读(134)  评论(3)    收藏  举报