您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 软件工程 > 汇编语言编程编程练习
1、汇编语言编程编程练习一、实验题1.非数值运算编程(a)实验目的通过非数值运算(如统计,分类,排序,代码转换等)编程,进一步掌握8086/8088汇编语言程序设计方法和技巧(b)实验内容·统计设有100H个数,编程统计正数、负数和零的个数。实验分析:程序中数的总数很多,某些部分需要重复执行,因此要用到循环结构。循环结构每次测试循环条件,当满足条件时,重复执行这一段程序;否则循环结束,顺序往下执行。其次,要统计正数、负数、零的个数,可以依靠标志位SF进行判断,SF=0,正数;SF=1,负数;零则为总数减去正负数的个数。该程序流程图如下:NOYES开始初始化:设置缓冲区BUFF指针BX,设定循环次数256,统计计数器DL清零执行:从BUFF取数,进行算术运算,判断符号标志位SF修改:移动缓冲区指针,循环次数减一循环控制:CX=0结束:将寄存器的统计结果存入MEM单元,将控制交操作系统程序如下所示:STACKSEGMENTSTACKDW128DUP(?)STACKENDSDATASEGMENTBUFFDB256DUP(?)MEM1DB?MEM2DB?MEM3DB?DATAENDSCODESE。
2、GMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVCX,256LEABX,BUFFXORDL,DLXORDH,DHXORSI,SI;统计计数器清0NEXT:MOVAL,[BX];取数据到ALADDAL,0;做运算,影响标志位SFJNSAA1;是正数,跳到AA1INCDL;是负数,统计加1AA1:INCDH;是正数,加1INCBX;移动指针LOOPNEXT;循环控制MOVMEM1,DLMOVMEM2,DHMOVMEM3,SI;保存统计结果MOVAX,4C00HINT21HCODEENDSENDSTART·代码转换编程将组合的BCD码9649转换成二进制数,考虑采用(((A*10)+B)*10)+C)*10+D的算法。实验分析:由学习已知,写成十六进制的BCD码和十进制码是完全一样的,比如,75D=(01110101)BCD,而(01110101)B=75H。BCD码的运算也遵循十进制运算规则,这一点可以方便计算机本身擅长的二进制运算结合BCD码的调整指令来完成。本题中,由于9469H计算机会默认为二进制数。因而,我们首先要做的是将9。
3、469hBCD码先转换成十进制数,计算机将会以二进制形式存储。最后再辅助程序令其输出在屏幕上。实验大抵流程如下:开始初始化:设定字节空间……执行:BCD码转化成十进制二进制码输出结束实验代码如下:DATASSEGMENTbuffer1DW9649hbuffer2DW?;分配两个字节的空间DATASENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AXmovax,[buffer1]andax,0f000hmovcl,12shrax,clmovdx,ax;至此,已将9649h(BCD)中的9(十进制)取出,并放入dx中callchange;调用chang,将9乘以10movax,dxmovbx,[buffer1]andbx,0f00hmovcl,8shrbx,claddax,bxmovdx,axcallchangemovax,dxmovbx,[buffer1]andbx,00f0hmovcl,4shrbx,claddax,bxmovdx,axcallchangemovax,dxmovbx,[buffer1]andbx。
4、,000fhaddax,bx;至此,ax中的值已是9649(十进制),但电脑是将其以二进制的形式存储的,故应是25B1h,二进制就是0010010110110001movbuffer2,ax;因为后面会用到ah,为避免在其过程中丢失ax中的数据,故将ax中的数据放入buffer2中movcx,16again:shlbuffer2,1;将已经转换成二进制的数逐个显示出来movdl,0adcdl,30hmovah,2int21hloopagainmovah,4CHINT21Hchangeproc;子程序change的功能是实现dx乘以10adddx,dxmovcx,dxadddx,dxadddx,dxadddx,cxretchangeENDPCODESENDSENDSTART·排序将80H个无符号的八位二进制数按递增方式排列。同时考虑它们有符号数、递减等方式。实验分析:实验要求将数排序,则用CMP比较两个数大小,用标志位JNG(有符号位不大于),JGE(有符号位不小于),JAE(无符号位不低于)来判定排序种类。准备将该题用“冒泡排序法”,将其两两比较。前一个数较大(递减),则不会改变原来位。
5、置;否则,两数交换,依次将全部数据排序依次(小循环)。示例如下:13-399684-7558139684-3958-7596841358-39-7596845813-39-75不过,由于数据的原始情况不知,按以上方法排序一次不一定符合要求。本题采取多次小循环方法,用数据个数控制循环次数。这种方法效率低,不过在循环次数较少的情况下还是很简单的,毕竟原理很简单。该程序流程图如下:NOYESNOYES进入小循环直到数按照从大到小的顺序排列好为止。附程序如下:1)、无符号位从小到大:开始初始化:初始化数据段,设定循环次数执行:采用变址寻址,将前数与后数比较前数后数前后数交换位置地址加一将结果写入缓冲区CX数据总数结束进入下一循环STACKSEGMENTSTACKDW64DUP(?)STACKENDSDATASEGMENTBUFFDB128DUP(?)COUNTEQU$-BUFF;等值命令DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVCX,COUNT-1LOOP1:MOVDX,CX;保存循环次数MOVSI,0。
6、;采用变址寻址LOOP2:MOVAL,BUFF[SI]CMPAL,BUFF[SI+1];前数与后数比JNACOT;前个数小于(或等于),转(无符号)XCHGAL,BUFF[SI+1];否则交换内存位置MOVBUFF[SI],ALCOT:INCSILOOPLOOP2;所有数据排列一次MOVCX,DX;开始下一次排序LOOPLOOP1MOVAX,4C00HINT21HCODEENDSENDSTART2)、无符号位从大到小STACKSEGMENTSTACKDW64DUP(?)STACKENDSDATASEGMENTBUFFDB128DUP(?)COUNTEQU$-BUFF;等值命令DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVCX,COUNT-1LOOP1:MOVDX,CXMOVSI,0LOOP2:MOVAL,BUFF[SI]CMPAL,BUFF[SI+1]JNGCOT;前个数小于(或等于),转(有符号)XCHGAL,BUFF[SI+1]MOVBUFF[SI],ALCOT:INCSILOOPLOOP2MO。
7、VCX,DXLOOPLOOP1MOVAX,4C00HINT21HCODEENDSENDSTART3)、有符号位递减STACKSEGMENTSTACKDW64DUP(?)STACKENDSDATASEGMENTBUFFDB128DUP(?)COUNTEQU$-BUFF;等值命令DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVCX,COUNT-1LOOP1:MOVDX,CXMOVSI,0LOOP2:MOVAL,BUFF[SI]CMPAL,BUFF[SI+1]JGECOT;前个数大于(或等于),转(有符号)XCHGAL,BUFF[SI+1]MOVBUFF[SI],ALCOT:INCSILOOPLOOP2MOVCX,DXLOOPLOOP1MOVAX,4C00HINT21HCODEENDSENDSTART2、数值运算编程(a)实验目的通过编程及程序调式,熟悉8086/8088运算指令及DEBUG动态调试程序的方法(b)实验内容·无符号二进制数运算已知有20个8位的无符号二进制数,编一个程序完成对这些数的求和。实。
8、验分析:求20个无符号的八位二进制数,直接进行二进制运算要将数值转换成二进制形式比较繁琐。由此想到写成十六进制的BCD码和十进制码是完全一样的,比如,75D=(01110101)BCD,而(01110101)B=75H。BCD码的运算也遵循十进制运算规则,这一点可以方便计算机本身擅长的二进制运算结合BCD码的调整指令来完成。将输入的20个无符号八位二进制数看成BCD码的十六进制表示,直接进行BCD加法运算。最终将结果转换成以ASCII码形式输出,即为所得数的十六进制BCD码形式。流程图略。实验代码如下(参考):STACKSEGMENTSTACK'STACK';STACKSEGMENTDW128DUP(?);128WORDSSTACKENDS;SEGMENTENDDATASEGMENTPARA'DATA';DATASEGMENTTABLEDB01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20TOTALDW?;BCD加法运算结果PRINTDB?;显示的ASCII字符DATAENDS;SEGMENTENDCODESEGMEN。
9、TPARA'CODE'ASSUMECS:CODE,DS:DATA,SS:STACKMAINPROCFARPUSHDSSUBAX,AXPUSHAX;DS:0000为返回地址MOVAX,DATAMOVDS,AX;DS初始化MOVAX,0LEABX,TABLE;DS:BX指向TABLE的首地址MOVCX,20;循环20次SUM:ADDAL,[BX]JNCOVERINCAHCLCOVER:INCBXLOOPSUMMOVTOTAL,AXMOVCX,0010LEASI,PRINT+3L20:CMPAX,CX;值10?JBL30;是,退出XORDX,DX;清除高位商DIVCX;除以10ORDL,30HMOV[SI],DL;存ASCII字符DECSIJMPL20L30:ORAL,30H;存最后的商MOV[SI],AL;作为ASCII字符MOVAH,02H;打印算术结果;MOVCX,4LEADI,PRINTL10:MOVDL,[DI]INT21HINCDILOOPL10MOVAX,4C00HINT21HMAINENDPCODEENDSENDMAIN·BCD算术运算已知两个6位的BCD码,完成减法运算,设。
10、被减数为123456,减数为789123实验分析:本题中先做减法,再采用未组合的BCD码减法调整,从低位开始逐位做减法运算。将计算结果低位存入AL,高位存于AH。总体来说,该题原理较为简单。实验代码如下(参考):STACKSEGMENTSTACKDW128DUP(?)STACKENDSDATASEGMENTPARA'DATA'NUMBER1DB'789123'NUMBER2DB'123456'SFDB'-';需打印的符号RESULTDB?;存算术结果DATAENDSCODESEGMENTPARA'CODE'ASSUMECS:CODE,DS:DATA,SS:STACKMAINPROCFARPUSHDSSUBAX,AXPUSHAXMOVAX,DATAMOVDS,AXLEASI,NUMBER1+5LEADI,NUMBER2+5LEABX,RESULT+5MOVCX,6CLCMOVAL,[SI];将低位放在AL中L10:MOVAH,[SI-1];将高位放在AH中SBBAL,[DI]AAS;做ASCII减法调整ORAX,3030HMOV[BX],AL;存单位运算结果MOVAL,AH;将下一位。
本文标题:汇编语言编程编程练习
链接地址:https://www.777doc.com/doc-7037486 .html