实验4 汇编应用编程和c语言程序反汇编分析
实验任务1
编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'welcome to masm!'。
代码如下:
运行结果如下:
实验任务2
编写子程序printStr,实现以指定颜色在屏幕上输出字符串。调用它,完成字符串输出。
使用任意文本编辑器,录入汇编源程序task2.asm。
运行如下:
对源程序做如下修改:
把line3改为: str db 'another try',0
把line12改为: mov al,4
再次汇编、运行程序,观察运行结果。
问题1:line19-22, line36-39,这组对称使用的push、pop,这样用的目的是什么?
分析:暂存对应寄存器的内容,执行完子程序后可以进行恢复。
问题2:line30的功能是什么?
分析:将低位的字符信息和高位的颜色信息存储到显存中。
实验任务3
使用任意文本编辑器,录入汇编源程序task3.asm。
阅读源代码,理解子程序num2str的汇编实现。
子任务1
对task3.asm进行汇编、链接,得到可执行程序后,在debug中使用u命令反汇编,使用g命令执行
到line15(程序退出之前),使用d命令查看数据段内容,观察是否把转换后的数字字符串'1984'存放
在数据段中str标号后面的单元。
子任务2
对task3.asm源代码进行修改、完善,把task2.asm中用于输出以0结尾的字符串的子程序加进来,
实现对转换后的字符串进行输出。
把task3.asm源代码中,line3中整数改成0~2559之间的任意数值,运行测试,观察结果。
改成1324:
实验任务4
使用任意文本编辑器,录入汇编源程序task4.asm。
运行如下:
问题1:line12-19实现的功能是?
分析:利用int 21h的1号子功能,判断是否为‘#’。
问题2:line21-27实现的功能是?
分析:利用int 21h的2号子功能,输出键盘输入的‘#’之前的内容。
实验任务5
在visual studio集成环境中,编写一个简单的包含有函数调用的c程序。
代码如下:
设置断点并进行反汇编:
分析:高级语言中,参数传递和返回值在汇编语言中是通过栈,使用call指令操作,使用eax、ebp等寄存器来实现的。
(1)将函数参数入栈,第一个参数在栈顶,最后一个参数在栈底。
(2)执行call指令,调用该函数,进入函数的代码空间。
(3)函数返回到call指令的下一行,将堆栈指针加一个数值(入栈参数的总长度),恢复到步骤1之前的值。