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

目录


 

  • 实验结论
  • 实验总结

一、实验结论


1. 实验任务一:编程实现在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'welcome to masm!'。

1)编写task1.asm文件

 

 

2)在DOSBox中运行,结果如下

 

 

3)实现过程说明

  数据段存储需要输出到控制台的信息,包括字符内容以及字符样式信息

  程序段则通过两层循环的嵌套,将对应字符输出到指定位置,指定位置可通过80*25偏移地址表结合字符长度来计算得到

2.试验任务二:编写子程序printStr,实现以指定颜色在屏幕上输出字符串,调用它,完成字符串输出。

1)录入task2.asm文件

 

 

2)汇编、运行程序

3)修改line3,line12

4)再次汇编、运行程序

 

 

5)回答:

  line19-22, line36-39中对称使用的push、pop的目的是:将工作状态保存在栈中,当内部函数执行结束后,再从栈中恢复工作状态,以满足编程需求(通常我们不希望内部函数的运行对外部无关寄存器产生影响)

  line30的功能:将cx寄存器中带字符样式的字符写入显存中,实现字符输出到屏幕

3.实验任务三:阅读num2str代码,分析其原理,num2str的功能是把0-2559之间的任意整数转换成数字字符串。

1)录入汇编程序task3.asm

 

 

 2)汇编、链接,得到可执行程序后,在debug中使用u命令反汇编,使用g命令执行到line15,使用d命令查看数据段内容

可以看到1984被添加到数据段中

3)把task2.asm中用于输出以0结尾的字符串的子程序加进来,实现对转换后字符串进行输出

 

 

 

 

 

 运行结果:

 

 

4.实验任务四:理解task4.asm程序功能,了解软中断指令。

1)录入汇编源程序task4.asm

 

 

2)汇编、链接、运行程序,输入一个字符串并以#结束(比如,2020, bye#)观察运行结果

 

 

3)回答:

  ine12-line19 将输入的字符利用si作为指针保存到ds中,并判断是否为#,如果是#则结束输入,否则继续读入新的字符。

  line21-line27 将保存在ds中的字符逐个输出到#后面。

5.实验任务五:在visual studio集成环境中,编写c程序,在调试模式下,查看反汇编代码

1)编写源程序,并设置断点

 

 

2)进入调试模式并查看反汇编

 

 

 

 

3)回答:

  在高级语言中,参数传递和返回值是通过call指令配合寄存器eax,ecx来实现的。

  参数的入栈顺序,是从后至前执行入栈的,即函数的第一个参数会在最后一个入栈。

  返回值的带回是通过寄存器eax进行传递的

二、实验总结

  1. 通过visual studio的反汇编功能,将我们平时编写的高级语言代码与课程中学习的汇编语言联系在了一起,帮助我们加深了对汇编语言的实际理解,

  2. 通过本实验我首先对汇编语言有了更为深刻的理解,体会到了从汇编语言角度实现算法设计的思路过程;其次也了解到了C语言生成编译文件实现函数调用,参数传递的方法,对所学的知识有了一个较低层次的融会贯通。

posted on 2020-12-18 09:41  FreedYool  阅读(146)  评论(2)    收藏  举报