同济大学电子与信息工程学院信息与通信工程系实验报告实验一显示程序实验1.实验目的(1)掌握在PC机上以十六进制形式显示数据的方法。(2)掌握部分DOS功能调用使用方法。(3)熟悉Tddebug调试环境和TurboDebugger的使用。2.实验设备PC微机一台。3.实验内容及说明一般来说,有很多程序需要显示输出提示运行的状况和结果,有的还需要将数据区中的内容显示在屏幕上。本实验要求将指定数据区的数据以十六进制数形式显示在屏幕上,并通过DOS功能调用完成一些提示信息的显示。实验中可使用DOS功能调用(INT21H)。(1)显示单个字符输出入口:AH=02H调用参数:DL=输出字符(2)显示字符串入口:AH=09H调用参数:DS:DX=串地址,‘S’为结束字符(3)键盘输入并回显入口:AH=01H返回参数:AL=输出字符(4)返回DOS系统入口:AH=4CH调用参数:AL=返回码4.实验步骤(1)运行Tddebug软件,选择Edit菜单,根据实验内容的描述编写实验程序,本实验显示部分参考实验流程如图2-1-1示。(2)使用Compile菜单中的Compile和Link对实验程序进行汇编、连接。(3)使用Rmrun菜单中的Run,运行程序,观察运行结果。(4)使用Rmrun菜单中的Debug,调试程序,观察调试过程中,数据传输指令执行后,各寄存器及数据区的内容。(5)更改数据区中的数据,考察程序的正确性。图1显示程序实验流程图5.实验程序;显示程序实验STACK1SEGMENTSTACKDW256DUP(?)STACK1ENDSDATASEGMENTUSE16MESDB'Pressanykeytoexit!',0AH,0DH,0AH,0DH,'$'MES1DB'Showaashex:',0AH,0DH,'$'SDDB'a'DATAENDSCODESEGMENTUSE16ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDX,OFFSETMES;显示退出提示MOVAH,09HINT21HMOVDX,OFFSETMES1;showmessageMOVAH,09HINT21HMOVSI,OFFSETSDMOVAL,DS:[SI]ANDAL,0F0H;取高4位SHRAL,4CMPAL,0AH;是否是A以上的数JBC2ADDAL,07HC2:ADDAL,30HMOVDL,AL;showcharacterMOVAH,02HINT21HMOVAL,DS:[SI]ANDAL,0FH;取低4位CMPAL,0AHJBC3ADDAL,07HC3:ADDAL,30HMOVDL,AL;showcharacterMOVAH,02HINT21HKEY:MOVAH,1;判断是否有按键按下?INT16HJZKEYMOVAX,4C00H;gobacktodosINT21HCODEENDSENDSTART6.实验结果:a的十六进制数表示为3D。7.实验小结初步了解掌握部分DOS功能调用使用方法。并且熟悉Tddebug调试环境和TurboDebugger的使用。实验二数码转换程序实验1.实验目的掌握不同进制数及编码相互转换的程序设计方法。2.实验设备PC微机一台。3.实验内容及说明计算机输入设备输入的信息一般是由ASCII码或BCD码表示的数据或字符,CPU一般均用二进制数进行计算或其他信息处理,处理结果的输出又必须依照外设的要求变为ASCII码、BCD码或七段显示码等。因此,在应用软件中,各类数制的转换和代码的转换是必不可少的。计算机与外设间的数码转换关系如图2-3-1所示,数码对应关系如表2-3-1所示。图1计算机与外设间的数码转换关系(1)将ASCII码表示的十进制数转换为二进制数十进制数可以表示为:1010010101010ninninniDDDD,其中Di代表十进制数1、2、3…9、0。上式可转换为:121001010101010niinnniDDDDDD由上式可归纳十进制数转换为二进制的方法:从十进制数的最高位Dn开始作乘10加次位的操作,依次迭代类推,则可求出二进制数结果。本实验要求将缓冲区中的一个五位十进制数00012的ASCII码转换成二进制数,并将转换结果按位显示在屏幕上。转换过程的参考流程如图2所示。表1数码转换对应关系图2十进制ASCII转换为二进制数参考流程;A2-1.asm;将ASCII码十进制数转换为二进制数STACK1SEGMENTSTACKDW256DUP(?)STACK1ENDSDDATASEGMENTMES1DB'Theasciicodeofdecimalcodeare:$'BUFDB30H,30H,30H,31H,32HDB10HDUP(0)DDATAENDSCODESEGMENTASSUMECS:CODE,DS:DDATASTART:MOVAX,DDATAMOVDS,AXMOVSI,OFFSETBUFMOVBX,000AHMOVCX,0004HMOVAH,00HMOVAL,[SI]SUBAL,30HA1:IMULBXADDAL,[SI+01](ADCAL,[SI+01]SUBAL,30HJNCA2ADDAH,01HA2:SUBAL,30H)INCSILOOPA1MOV[SI],AXMOVDX,OFFSETMES1MOVAH,09HINT21HINCSI;显示高字节CALLSHOWDECSI;显示低字节CALLSHOWMOVAX,4C00HINT21HSHOWPROCNEARMOVAL,DS:[SI]ANDAL,0F0H;取高4位SHRAL,4CMPAL,0AH;是否是A以上的数JBC2ADDAL,07HC2:ADDAL,30HMOVDL,AL;showcharacterMOVAH,02HINT21HMOVAL,DS:[SI]ANDAL,0FH;取低4位CMPAL,0AHJBC3ADDAL,07HC3:ADDAL,30HMOVDL,AL;showcharacterMOVAH,02HINT21HRETENDPCODEENDSENDSTART(2)将十进制数的ASCII码转换为BCD码本实验要求将键盘输入的一个五位十进制数54321的ASCⅡ码存放在数据区中,转换为BCD码后,并将转换结果按位分别显示于屏幕上。若输入的不是十进制数的ASCⅡ码,则输出“FF”。提示:一字节ASCⅡ码取其低四位即变为BCD码。转换部分的实验流程参见图3。图3十进制ASCII转换为BCD码数参考流程;A2-2.asm;将十进制数的ASCII码转换为BCD码STACK1SEGMENTSTACKDW256DUP(?)STACK1ENDSDDATASEGMENTMES1DB'TheBCDcodeofdecimalare:$'BUFDB31H,32H,33H,34H,35HDB10HDUP(0)DDATAENDSCODESEGMENTASSUMECS:CODE,DS:DDATASTART:MOVAX,DDATAMOVDS,AXMOVCX,0005HMOVDI,OFFSETBUFA1:MOVBL,0FFHMOVAL,[DI]CMPAL,3AH;比较AL中的数是否是0~9的;ASCII码JNBA2SUBAL,30HJBA2MOVBL,ALA2:MOVAL,BLMOV[DI+05H],ALINCDILOOPA1MOVSI,DIMOVCX,05HMOVDX,OFFSETMES1MOVAH,09HINT21HA3:CALLSHOWMOVDL,20HMOVAH,02HINT21HINCSILOOPA3MOVAX,4C00HINT21HSHOWPROCNEARMOVAL,DS:[SI]ANDAL,0F0H;取高4位SHRAL,4CMPAL,0AH;是否是A以上的数JBC2ADDAL,07HC2:ADDAL,30HMOVDL,AL;showcharacterMOVAH,02HINT21HMOVAL,DS:[SI]ANDAL,0FH;取低4位CMPAL,0AHJBC3ADDAL,07HC3:ADDAL,30HMOVDL,AL;showcharacterMOVAH,02HINT21HRETENDPCODEENDSENDSTART附:括号内的为更改后的程序。4.实验步骤(1)运行Tddebug软件,选择Edit菜单,根据实验内容描述的数码转换内容分别编写实验程序。(2)利用Compile菜单中的Compile和Link对实验程序进行汇编、连接。(3)利用Rmrun菜单中的Run,运行程序,观察运行结果。(4)使用Rmrun菜单中的Debug,调试程序,观察调试过程中,数据传输指令执行后,各寄存器及数据区的内容。更改数据区中的数据,考察程序的正确性。5.实验结果(1)30H,30H,30H,31H,32H——000C30H,30H,30H,31H,32H——00FF30H,30H,30H,31H,32H——0100(2)01020304056.实验小结本次实验使我对编码转换的程序有了进一步的掌握。实验三循环程序设计实验1.实验目的掌握循环程序的设计方法。2.实验设备PC微机一台。3.实验内容及说明一个循环程序通常由以下几个部分组成:1)循环初始化部分:用于对相关内存单元及寄存器设置初始值,如设置地址指针、循环次数、某些标志位等。只有正确地进行了初始化设置,循环程序才能正确运行并及时停止。2)循环体:对要求重复执行的程序段部分,对应于要求重复执行的操作。3)循环控制部分:为下一轮处理修正地址指针及循环次数等,并判断循环结束的条件是否满足,若满足则退出循环。4)循环结束部分:用于保存循环运行的结果等。(1)编写程序完成对10个数的求和分析:需分配空间保存和数(SUM),在循环体中进行求和操作。4.实验程序:DATASEGMENTBUFFERDW1,2,3,4,5,6,7,8,9,10;(10,20,30,40,50,60,70,80,90,100)原始10个数据SUMDW?;存放和数DATAENDSSTACKSEGMENTSTACK‘STACK’DB100DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,0;AX中为和数,初始为0MOVDI,OFFSETSUM;存放结果地址送DIMOVBX,OFFSETBUFFER;数据缓冲区首地址;送BXMOVCX,10;循环次数送CXLOOP1:ADDAX,[BX];累加INCBX;修改数据缓冲区地址INCBXDECCX;次数减1JNZLOOP1;到10次了吗?不到,;转LOOP1MOV[DI],AX;到10次,存放结果CALLSHOWMOVAX,4C00H;返回DOSINT21HSHOWPROCNEARMOVAL,DS:[DI]MOVAX,DS:[DI]ANDAL,0F0HANDAX,0F00HSHRAL,4SHRAX,8CMPAL,0AHCMPAL,0AHJBC2JBC1ADDAL,07HC1:ADDAL,30HMOVDL,ALMOVAH,02HINT21HMOVAL,DS:[DI]ANDAL,0F0HSHRAL,4CMPAL,0AHJBC2ADDAL,07H)C2:ADDAL,30HMOVDL,ALMOVAH,02HINT21HMOVAL,DS:[DI]ANDAL,0FHCMPAL,0AHJBC3ADDAL,07HC3:ADDAL,30HMOVDL,ALMOVAH,02HINT21HRETENDPCODEENDSENDSTART(2)给定一串16位数,找出其中大于零、等于零和小于零的个数。分析:这是一个统计问题,需设置三个计数器分别统计三种情况下的结果。参考程序清单:DATASEGMENTBUFFDW22H,31H,43H,990H,00H,8990H;原始16个数据COUNTEQU$-BUFF;COUNT的值为BU