您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 交通运输 > 汇编语言编程实验报告
汇编语言编程实验报告学号:姓名:成绩:-2-目录一、实验一:...................................................错误!未定义书签。二、实验二:.................................................................................4三、实验三:.................................................................................8四、实验四:................................................................................10五、实验五:...................................................错误!未定义书签。六、实验六:................................................................................19七、汇编实验总结........................................................................23-3-实验一一.实验题目【汇编语言补充作业T20】编写完整程序,利用DOS系统功能调用,从键盘输入一个字符串,并将该字符串从屏幕上换行后并输出。二.程序流程及思路实现字符串输入,需要分成三个步骤:1、在数据段中定义一个缓存区为存放字符串做准备;2、DOS系统功能调用0AH号子功能,(DS:DX)=输入缓冲区首址;3、在输入的字符串尾加上‘$’字符,以作为输出结束条件。实现字符串输出,则需要注意的问题是:1、缓冲区第三个字节才开始存放输入的字符,前两个字节分别存放缓冲区长度和字符串实际字符数;2、输出回车换行可利用字符串:CRDB0AH,0DH,’$’。三.源程序清单DATASEGMENTNEQU50MAXLENDBN;缓冲区字符的最大长度ACTLENDB?;实际字符个数STRINGDBNDUP(?);字符空间CRDB0AH,0DH,'$'DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXLEADX,MAXLENMOVAH,0AHINT21H;字符串输入MOVAH,09HLEADX,CRINT21H;回车换行MOVBL,MAXLEN+1;取实际的字符长度MOVBH,0LEASI,MAXLEN+2;取字符开始的首地址-4-MOVBYTEPTR[SI+BX],'$';输出结尾要加上$MOVDX,SI;把开始存放字符的首地址赋给DXMOVAH,09HINT21HMOVAH,4CHINT21HCODEENDSENDSTART四.结果拷屏-5-实验二一.实验题目【汇编语言补充作业T23】假设CX:BX中存放了4为非压缩的BCD码表示的十进制数4386,请编写完整程序将这个数转化成2进制数并存放到DI寄存器中。二.程序流程及思路首先,要解决以上问题需分三个步骤进行:1、将CX:BX中的非压缩BCD码调整成压缩BCD码。这有两种方法:a、利用非压缩BCD码调整指令AAD,达到以上目的;b、利用移位指令,将两个非压缩BCD码进行整合,达到以上目的;(注:以下程序采用b方法)2、将调整后的压缩BCD码转化为十进制数。调整后b3b2=43,b1b0=86。转化方法为b3b2*100+b1b0→DI。计算结果送入DI寄存器中。由于100=64+32+4,因此考虑用移位指令进行BCD码的乘法运算。3、利用移位指令编写一段代码进行结果输出,以便于在屏幕上直接进行核对检验。三.源程序清单DATASEGMENTDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKstart:movch,04movcl,03movbh,08movbl,06;moval,chmovah,0shlax,1;ch位乘10(10=8+2)movsi,axshlax,1shlax,1addax,si;movch,0addax,cx-6-movdx,ax;dx=43shldx,1shldx,1movax,dxshldx,1shldx,1shldx,1addax,dxshldx,1;adddx,ax;dx乘以100(100=64+32+4)moval,bhmovah,0movsi,0shlax,1;bh位乘10movsi,axshlax,1shlax,1addax,si;movbh,0addax,bxadddx,axmovdi,dxshow:movcl,4;该段进行结果输出检验movbx,dxshrbh,clmovdl,bhadddl,30hmovah,2int21h;1位movbh,dhandbh,0Fhmovdl,bhadddl,30hmovah,2int21h;2位movdh,blshrdh,clmovdl,dhadddl,30h-7-movah,2int21h;3位movdh,blanddh,0Fhmovdl,dhadddl,30hmovah,2int21h;4位movah,4chint21hcodeendsendstart五.结果拷屏输出结果为1122[十六进制],将题目中4386换成4096,输出如下,为1000[十六进制]:-8--9-实验三一.实验题目【汇编语言补充作业T22】已知有以下数据段定义:NUMDW3570STRINGDB5DUP(20H),’$’;20H为空格的ASCII码请编写完整程序,在屏幕上以十进制的形式将NUM这个数打印出来,可以借助STRING这个字符串。(NUM这个数可以定义为一个任意字型数)二.程序流程及思路考虑到NUM在寄存器中以十六进制数的形式进行存放,转化成十进制数可能最大值为65535,则输出刚好输出的十进制数位数为5位。因此,需要除以10000d,1000d,100d,10d,1d来分别取出该数各位数值,并在屏幕上连续打印。其过程为:1、将NUM先存入寄存器SI中,除数为10000d;2、除法完成后,商直接输出,余数保留并且存入SI中;3、依次将除数换成1000d,100d,10d,1d,重复2操作,直到程序结束。另外,程序打印每一位所执行的动作需要重复五次,因此将该过程写成一个子程序(chufa)进行调用,可以简化代码,使得程序可读性更强,程序健壮性更好。三.源程序清单DATASEGMENTNUMDW3570DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKstart:MOVAX,DATAMOVDS,AXmovsi,nummovcx,10000dcallchufamovcx,1000dcallchufamovcx,100dcallchufamovcx,10dcallchufamovcx,1d-10-callchufamovah,4Chint21hchufa:movax,si;si存储的是要输出的十进制数据movdx,0divcxmovsi,dx;余数赋给si寄存器,为下一步出发做准备movdl,aladddl,30hmovah,2int21h;除法的商直接输出retcodeendsendstart四.结果拷屏以上为NUM=3570d时程序输出结果为03570,若将NUM改为1122H,则输出如下,结果为04386:-11--12-实验四一.实验题目【汇编语言补充作业T13】请编写完整程序在一个升序字节数组中查找数N,找到后将此数从数组中删除,并使得CF=0;没找到返回CF=1。数组的首地址和末地址为A_HEAD和A_END。二.程序流程及思路删除升序数组中的一个数N的关键步骤是将这个数搜索出来。若搜索到,则进行删除,然后对整个数组进行调整;若未搜索到,则无操作动作。其中进行搜索的方法为逐个比较。程序流程图如下:开始初始化数组ARRAY_HEAD,ARRAY_END,目标数NBX←ARRAY_HEAD,BX=ARRAY_END[BX]=NDELETE:CF←0,ARRAY_END←ARRAY_END-1,调整EXIT:CF←1BX←BX+1结束YYNN-13-三.源程序清单DATASEGMENTARRAYDB1,2,3,4,5,6,7,8,9,0LENGEQU$-ARRAYARRAY_ENDDW?ARRAY_HEADDW?NUMDB5DATAENDSSTACKSEGMENTSTACKSTACKENDSCODESEGMENTASSUMEDS:DATA,CS:CODE,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAL,LENGCBWMOVBX,OFFSETARRAYMOVARRAY_HEAD,BXADDAX,BXMOVDI,AXDECDIMOVARRAY_END,DIMOVAX,0MOVAL,NUML1:MOVDL,0MOVDL,[BX]CMPDL,AL;当前数与NUM进行比较JNEL2;不相等跳转至L2JMPDELETE;相等跳转至DELETEL2:INCBXCMPBX,ARRAY_ENDJBEL1;指针+1,并循环STCJMPEXITDELETE:MOVDI,ARRAY_ENDSUBDI,BX-14-MOVCX,DIDEL:MOVDX,[BX+1];将BX之后的数依次前移一位MOV[BX],DXINCBXLOOPDELDECARRAY_END;删除后ARRAY_END前移CLCJMPEXITEXIT:MOVCX,0MOVCX,ARRAY_ENDMOVAX,OFFSETARRAYSUBCX,AXINCCXMOVBX,0SHOW:MOVDL,[ARRAY+BX];将删除后数组元素打印以检验ADDDL,30HMOVAH,2INT21HINCBXLOOPSHOWMOVAH,4CHINT21HCODEENDSENDSTART四.结果拷屏-15-以上输出为在1、2、3、4、5、6、7、8、9、0数组中删去N=5的结果调用debug-t命令可以查看CF标志位状态:可见,CF位为0,若当N=10,在数组里未找到目标数,则结果为:可见数组元素不变,且CF=1-16-实验五一.实验题目【汇编语言补充作业T14】请编写完整程序从键盘读取字符,如果是十进制的0—9,则在屏幕上输出该数的八位二进制码,并将数字依次存放到BUF开头的数组中;如果读取的字符是‘Q’或者‘q’,则程序退出;其他情况在屏幕上打印“Youmustinput0-9or‘q’or‘Q’”。(如输入的字符是‘9’,则输出00001001)提示:输出一个数的2进制形式应该从最高位开始输出,可以将此段程序定义为一个过程。二.程序流程及思路总体流程:1、利用DOS系统功能调用21H的01号子功能读取键盘输入的一个字符x,换行,然后将x与0、9的ASCII码进行比较,若在0—9范围内,则跳至2;不在该范围内跳至3;2、打印该数的二进制形式,将该数存入数组BUF中,换行,跳至1;3、将x与Q、q的ASCII码进行比较,若相等,则打印数组内容,退出程序;否则,跳至4;4、打印字符串“Youmustinput0-9or‘q’or‘Q’”,换行,跳至1;由以上过程看出,程序的唯一退出条件为输入字符‘q’或‘Q’。流程图如下图:二进制形式打印定义的过程如下:初始化:除数A=128(2的7次方),被除数为B1、B除以A,打印商,B←余数,A←A/2。若A=1,跳至2;否则,重复1;2、退出打印。另外,程序定义变量B_END作为数组的尾指针,当符合输出规则,将输入的数存放入数组BUF中,尾指针后移一位。这样定义便于在输出数组的时候定制结束条件。程序中定义数组的大小20个字节。-17-三.源程序清单DATASEGMENTMESSAGED
本文标题:汇编语言编程实验报告
链接地址:https://www.777doc.com/doc-4977371 .html