0一.实验目的与内容目的:1)进一步熟悉汇编语言程序的编辑、宏汇编、链接、运行基本概念;2)熟练掌握动态调试程序TD/DEBUG的常用命令或窗口功能,学会用TD/DEBUG调试程序,修改数据和寄存器等环境;3)熟悉掌握汇编语言程序的典型数据结构设计、典型程序流控制方法,了解DOS/BIOS功能调用的基本方法。内容:(1)编写程序实现如下功能:①从键盘输入任意字符串后,存入自定义存储单元,判断处理后将字符串中小写字母转换为大写字母(其他字符不变)并按原顺序将这些字符在屏幕上显示出来。②从键盘输入在0~65535之间的十进制数,将其转换为16进制数并在屏幕中显示出来,要求判断输入字符串是否为在0~65535之间的十进制数。(2)复习TD各种操作,并用DEBUG调试程序,学会基本命令操作,并通过单步、设置断点等方法观察中间结果,完成正常运行。命令行方式下直接键入debugmyfile.exe回车(myfile为待调试可执行程序),进入调试方式(显示-),键入H回车显示全部命令、格式和功能。常用命令有:U(反汇编)、A(汇编输入指令程序)、R(寄存器显示/修改)、I(端口输入)、O(端口输出)、D(显示数据)、E(修改数据)。除资源修改管理功能外,重点应用T(单步)、Tn(执行n步)、P(过程/指令)、G××××(从当前CS:IP执行到断点××××)或G=××××1××××2(从××××1执行到××××2断点)调试实验程序。程序流程图:1.2.1三.方案实现与测试1)实验一的基本实验内容和要求①编写代码完成功能要求,文件格式为.asm文件(如文件名为add.asm),将文件放入带汇编工具的文件夹中,即含有汇编工具(MASM/TASM.EXE)和链接工具(LINK/TLINK.EXE)的文件夹。②全屏启动命令行模式,进入上述文件夹输入:tasmadd.asm或masmadd回车后编译产生add.obj文件再输入:tlinkadd.obj或linkadd回车后链接产生add.exe文件如果程序有错误,编译时会产生错误提示,指出错误的位置和错误类型及错误码,改正错误后再重新编译链接。③启动TD并载入add.exe,在代码段可以看到程序指令,部分符号已被实际地址或数值替换表示。④直接运行:运用TD功能键F9,运行结果如下图所示2由图可以看出,在数据区13B3:0000到13B3:0005分别存放的是data1,data2两个加数和data3和的数据,且运行结果正确,在运行结束之后,寄存器器中的值恢复到随机值。⑤单步运行:使用TD功能键F7,当单步运行完movcx,0002这条指令后,程序的运行结果如下图所示⑥断点运行,比如在指令mov[si+0004],alzhetiao指令上设置断点后,程序的运行结果为:3⑧直接在代码区添加代码,如在指令movsi,00000后添加指令movax,100.程序结果2)汇编语言程序设计实验内容(1)从键盘输入任意字符串后,存入自定义存储单元,判断处理后将小写字母转换为大写字母(其他字符不变)并按原顺序将这些字符在屏幕上显示出来。①主要算法:dispprocnearxorcx,cx;给CX中的数据进行清零movcl,input[1];将输入的字符数付给cl,循环次数movsi,2;input[2]开始为实际输入的ASCII码again:movdl,input[si]4cmpdl,61h;判断是否为小写字母jbnextcmpdl,7ahjanextsubdl,20h;将小写字母转换为大写字母next:movah,02h;显示字符int21hincsi;SI指向下一个字符loopagainretdispendp②调试程序:使用单步运行的方法,输入字符串“123abc”,程序运行到调用子程序,单步运行指令movcl,[0001]后,发现此时CX中的数值变为6,符合我刚才输入的字符总数。程序第一次执行指令cmpdl,61,可以发现CF=1,此时程序跳转到显示字符程序段,符合我刚才输入的第一个字符1的情况。当CX=0003时,此时程序判断输入的字符a是否为小写字母,单步运行指令subdl,20h后,小写字母a被转换为A,程序运行结果正确。当子程序运行结束之后,回到主程序,当运行结果提示“Doyouwanttocontinue(y/n)”,此时如输入y,重复程序操作,如输入n,程序结束。最终程序运行结果如下图所示:(2)从键盘输入在0~65535之间的十进制数,将其转换为16进制数并在屏幕中显示出来,要求判断输入字符串是否为在0~65535之间的十进制数。①主要算法:changeprocnearclcxorax,axxorbx,bx1xordx,dxmovcl,input[1]movsi,2again:movbl,input[si]cmpbl,30hjberror1cmpbl,39hjaerror1subbl,30hdecclcmpcl,0jzovermovax,1pushcxloop2:multenlooploop2popcxmulbxaddoutput,axjcerrorincsijmpagainover:addoutput,bxjncover1error1:movright,0over1:retchangeendp②调试程序:使用单步运行的方法,输入字符串“123”,当程序运行到调用运行数值转换子程序,单步运行指令movbl,input[si],在调试程序段显示为movbl,[si+0001]。这里和上个字符串实验运行指令movdlinput[si]在调试程序段显示为何不同?经检查发现,在本程序的数据段中,input的值为0001.单步运行指令movcl[0002],发现CX中的数值变为3,符合输入字符串的个数。程序第一次运行指令cmpbl30h,开始为我输入的第一个字符是不是0-9,判断好之后,运行指令subbl,30h。将ASCII码转换为数字。程序将字符串都转换为数字之后,再将其转换为十六进制数并将其输出。当我输入的字符串不是0-65535中的数字时,此时程序运行结果会提示“Thenumberyouinputisnotfrom0-65535”.程序的运行结果如下图所示:1四.分析与总结通过对实验二内容的操作,熟悉并了解了如何在PC环境下,采用命令行的方式汇编,连接和运行汇编语言源程序。并熟练掌握了动态调试程序TD的常用命令和窗口功能,学会如何用TD程序调试程序和修改环境,并初步掌握了汇编语言程序程序流的控制方法。