1实验一基本程序编程和程序调试一、实验目的1、掌握数码转换等基本程序设计的技巧和方法。2、熟悉DEBUG命令。3、学会和掌握用DEBUG调试程序的方法。二、实验设备PC机一台,装有DOS基本系统三、实验内容及步骤用DEBUG建立、汇编和运行调试程序的操作。DEBUG是DOS系统支持的用于汇编语言源程序调试的系统软件。它共有19条命令完成相应的功能,命令及其格式可参阅附录一。(一)DEBUG操作练习1)实验调试程序程序的功能是从3500H内存单元开始建立0-15共16个数据。程序如下:地址(H)机器码(H)助记符2000BF0035MOVDI,35002003B91000MOVCX,00102006B80000MOVAX,000020099ESAHF200A8805MOVBYTE[DI],AL200C47INCDI200D40INCAX200E27DAA200FE2F9LOOP200A2011F4HLT2)实验步骤:(1)输入与修改①启动DOS,在DOS提示符下输入DEBUG后回车,屏幕立即显示DEBUG提示符“—”,表明已进入DEBUG状态,可以执行DEBUG的各种命令。②用DEBUG中的汇编命令“A地址”将程序建立在内存单元中。在提示符“—”下键入:“A2000”此时显示器上将会显示程序的段地址CS和偏移地址IP,你就可以输入以上的程序了。即显示169C:2000键入MOVDI,3500169C:2003MOVCX,00102169C:2011HLT:::③用反汇编命令“U地址”检查程序在提示符“—”下,键入“U2000”,将从2000内存单元开始的内容反汇编,屏幕上显示169C:2000BF0035MOVDI,3500169C:2003B91000MOVCX,0010169C:2006B8000MOVAX,0000::::::169C:2011F4HLT当发现程序有错时,可用汇编命令“A地址”进行修改,如要修改200A单元中的指令,则键入“A200A”,屏幕显示169C:200A,然后再键入MOVBYTE[DI],AL,就把错误的程序改正了。(2)显示和修改数据①用修改内存单元命令“E地址”在指定内存单元中存入一个数。如要在3500为首址的单元中存入14H和25H两个数据,可在提示符“—”下,键入:“3500”显示169C:3500××.键入14,按空格键××.25,按空格键②用显示内存命令“D地址”检查指定单元的内容在提示符“—”下,键入“D3500”显示1489:350014254802…………1489:3510********…………::3::1489:3570********…………若某单元内容有错则可用命令:“E地址”进行修正。③用显示和修改命令“R”或“R寄存器名”显示寄存器或修改其内容在提示符“—”下,键入“R”显示AX=0000BX=0000CX=0000DX=0000SP=FFEE……………………DS=169CES=169CSS=169CCS=169CIP=2000………………………要修改IP的内容时,键入命令“RIP”后,显示IP2000,在2000之后键入新内容。(3)程序运行程序的运行方式有单步运行、断点运行和连续运行几种方式。①单步运行输入DEBUG跟踪命令“T”或“T=地址”或“T=地址指定次数”,可从指定地址处运行该单元中的一条指令,以后只要连续输入“T”命令就能连续执行一条一条指令。如在提示符“—”下,键入“T=2000”显示:AX=0000BX=0000CX=001DDX-0000SP=FFEEBP=0000SI=0000DI=0000DS=169CES=169CSS=169CCS=169CIP=2000NV………169C:2003B91000MOVCX,00104②断点运行用运行命令“G=地址地址断点地址断点…”执行指定地址的程序在提示符“—”下,键入“G=20002011”显示169C:2011F4HLT表示这段程序已经执行完毕。③连续运行5输入DEBUG命令“G=地址”,执行指定地址的程序(4)用显示内存命令检查运行结果在提示符“—”下,键入命令“D地址”,根据其中的内容判断程序运行是否正确。如检查以上程序执行后的结果,在提示符“—”下,键入“D3500”,可显示169C:35000001020304……15169C:3510(二)数码转换程序及其调试1、将ASCII码表示的十进制数转换为二进制数1)程序设计的算法及其程序十进制数据可表示为:DI代表十进制数1,2,3,…9,0上式可转换为:由式(2)可归纳十进制数转换为二进制数的方法:从十进制的最高位Dn开始乘10加次位的操作,将结果再乘10再加下一次位,如此重复,则可求出二进制数结果来。程序流程及参考程序如图1-1。这里我们规定:被转换的ASCII码十进制数存放在3500H——3504H单位中。而转换结果存放在3510H——3511H单元中。2)实验步骤(1)输入程序并检查无误。)(iniinnnnDDDD)())))((DDDDDDnnninii(6(2)在3500H——3504H单元存入十进制数12的ASCII码,即E3500H↙,并输入3030303132H。(3)G=2000↙,运行程序,并用CTRL+C来中断程序返回监控状态。(4)用D3510↙来查看结果,应为:35100C00(5)反复试几组数,考查程序的正确性。地址(H)助记符注释2000MOVSI,3500;源地址2003MOVDI,3510;结果地址2006MOVBX,000A;乘数102009MOVCX,0004;计数200CMOVAH,00;AH清零200EMOVAL,[SI];取被转换数2010SUBAL,30;ASCII码变十进制数2012IMULBX;高位(AX)*(BX)送AX2014ADDAL,[SI+01];取下一位1017SUBAL,30;ASCII码减30变十进制数72019INCSI;源地址指针+1201ALOOP2012;CX-1,若CX不等于零则继续201CMOV[DI],AX;若CX等于零则存结果201EINT3图1-12将十进制数的ASCII码转换为BCD码1)程序流程和程序设从键盘输入的五位十进制数的ASCII码已存放在3500H起始的内存单元内,把它转换成BCD码后,再按位分别存入350AH起始的内存单元内。若输入的不是十进制数的ASCII码,则对应存放结果的内容为“FF”。一字节ASCII码取其低四位即变为BCD码,程序流程图及考程序如图1-2所示。2)实验步骤(1)输入程序并检查无误。(2)在3500H——3504H单元中存入五位十进制数的ASCII码,即E3500↙,并输入31,32,33,34,35。(3)G=2000↙,运行以上程序。(4)D350A↙,显示结果为:0000:350A0102030405CC…8(5)反复试几组数,考查程序的正确性。地址(H)助记符注释2000MOVCX,0005;循环计数器赋初值2003MOVDI,3500;ASCII码首址2006MOVBL,FF;错误标志送BL2008MOVAL,[DI];送ASCII码至AL200ACMPAL,3A;比较AL与3AH200CJNB2014;不低于3A则转2014200ESUBAL,30;低于3A则取ASCII码的低四位2010JB2014;低于30则转20142012MOVBL,AL;否则AL内容送BL,取代FF2014MOVAL,BL;结果或错误标志送AL2016MOV[DI+0A],AL2019INCDI9201ALOOP2006201CINT3图1-23将十六位二进制数转换为ASCII码表示的十进制数1)程序及其流程十六位二进制数的值域为0——65535,最大可转换为五位十进制数。算法:五位十进制数可表示为:Di:表示十进制数0——9。因此,将十六位二进制数转换为五位ASCII码表示表示的十进制数,就是求D1——D4,并将它化为ASCII码。程序流程图如图1-3所示,设源数据存于3500——3501H单元中,结果数存于3510——3514H单元中。2)实验步骤(1)输入程序并检查无误。(2)在3500——3501H单元中存放0C00,运行程序并检查结果,应看到3510——3514H单元中的数依次为3030303132。DDDDDND10(3)反复试几组数,并运行程序、观察结果。地址(H)助记符注释2000MOVDX,[3500];取二进制数2004MOVSI,3515;目标首址在35102007DECSI2008MOVAX,DX200AMOVDX,0000200DMOVCX,000A2010DIVCX;;除102012XCHGAX,DX2014ADDAL,302016MOV[SI],AL2018CMPDX,0000201BJNE2007201DCMPSI,3510;填余下高位为0112021JZ202A;2023DECSI2024MOVAL,302026MOV[SI],AL2028JMP201D202AINT3图1-34、十六进制数转换为ASCII码1)程序及其流程经过CPU处理后的十六进制数存放在起始地址为3500H的内存单元中,把它们转换成ASCII码之后,再分别存入起始地址为350AH的内存单元中。从表2-1中可知,十六进制数加30H即可得到0H——9H的ASCII码,而要得到AH——FH的ASCII码,则需再加7H。程序流程图及参考程序如图1-4所示。2)实验步骤(1)输入程序并检查无误。(2)在3500——3501H单元中存入四位十六进制数203B,即E3500↙,并输入3B,20。(3)G=2000↙,运行以上程序(4)D350A↙,显示结果为:0000:350A42333032CC…输入数据与结果ASCII码对应顺序相反。12(5)反复试几组数。考查程序的正确性。地址(H)助记符注释2000MOVCX,00042003MOVDI,35002006MOVDX,[DI]2008MOVAX,DX200AANDAX,000F;取低四位值200DCMPAL,0A;;判是否“0”-“9”200FJB2013;是“0”-“9”转20132011ADDAL,07;是“A”-“F”,加72013ADDAL,30;转换为ASCII码2015MOV[DI+0A],AL2018INCDI2019PUSHCX;保护循环计数器内容13201AMOVCL,04;移位次数送CL201CSHRDX,CL201EPOPCX201FLOOP20082021INT3图1-45BCD码转换为二进制数1)程序及其流程设四个二位十进制数的BCD码存放在起始地址为3500H的单元中,转换出的二进制数码存入起始地址为3510H的内存单元中,程序流程图及参考程序如图1-5所示。地址(H)助记符注释2000MOVCX,00042003MOVDI,35002006MOVAL,[DI]2008ADDAL,AL;乘2200AMOVBL,AL200CADDAL,AL;乘2200EADDAL,AL;乘22010ADDAL,BL;乘102012INCDI2013MOVAH,002015ADDAL,[DI];BCD码十位与个位加2017MOV[DI+0F],AX;存结果图1-5201AINCDI201BLOOP2006201DINT32)实验步骤(1)输入程序并检查无误。14(2)在3500——3507单元中存入四个十进制数(12,34,56,78)的BCD码,即E3500↙输入01,02,03,04,05,06,07,08。(3)G=2000↙,运行以上程序。(4)D3510↙,显示结果为35100C00220038004E00(5)反复试几组数,考查程序的正确性。15四、思考题1、图1