实验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;

浙公网安备 33010602011771号