汇编语言程序例题

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

【例5.1】试编写一程序计算以下表达式的值。w=(v-(x*y+z-540))/x式中x、y、z、v均为有符号字数据。设x、y、z、v的值存放在字变量X、Y、Z、V中,结果存放在双字变量W之中,程序的流程图如图5.1所示。DATASEGMENTXDW200YDW100ZDW3000VDW10000WDW2DUP(?)DATAENDSSTACKSEGMENTSTACKDB200DUP(0)STACKENDSCODESEGMENTASSUMEDS:DATA,CS:CODE,SS:STACKSTART:MOVAX,DATAMOVDS,AX;DATA→AXMOVAX,XIMULY;(X)*(Y)→DX:AXMOVCX,AXMOVBX,DX;(DX:AX)→(BX:CX)MOVAX,ZCWD;(Z)符号扩展ADDCX,AXADCBX,DX;(BX:CX)+(DX:AX)→(BX:CX)SUBCX,540SBBBX,0;(BX:CX)-540→(BX:CX)MOVAX,VCWD;(V)符号扩展SUBAX,CXSBBDX,BX;(DX:AX)-(BX:CX)→(DX:AX)IDIVX;(DX:AX)/XMOVW,AX;商→WMOVW+2,DX;余数DX→W+2MOVAH,4CHINT21HCODEENDS;退出DOS状态ENDSTART【例5.2】已知某班学生的英语成绩按学号(从1开始)从小到大的顺序排列在TAB表中,要查的学生的学号放在变量NO中,查表结果放在变量ENGLISH中。编写程序如下:STACKSEGMENTSTACKDB200DUP(0)STACKENDSDATASEGMENTTABDB80,85,86,71,79,96DB83,56,32,66,78,84NODB10ENGLISTDB?DATAENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODEBEGIN:MOVAX,DATAMOVDS,AXLEABX,TABMOVAL,NODELALXLATTABMOVENGLISH,ALMOVAH,4CHINT21HCODEENDSENDBEGIN【例5.3】已知在内存中有一个字节单元NUM,存有带符号数据,要求计算出它的绝对值后,放入RESULT单元中。题目分析:根据数学中绝对值的概念知道,一个正数的绝对值是它本身,而一个负数的绝对值是它的相反数;要计算一个数的相反数,需要完成减法运算,即用0减去这个数。8086/8088指令系统中有专门的求相反数的指令NEG。DATASEGMENTXDB-25RESULTDB?DATAENDSCODESEGMENTASSUMEDS:DATA,CS:CODESTART:MOVAX,DATAMOVDS,AX;初始化MOVAL,X;X取到AL中TESTAL,80H;测试AL正负JZNEXT;为正,转NEXTNEGAL;否则AL求补NEXT:MOVRESULT,AL;送结果MOVAH,4CHINT21H;返回DOSCODEENDSENDSTART【例5.4】编写计算下面函数值的程序:1X0Y=0X=0-1X0设输入数据为X、输出数据Y,且皆为字节变量。程序流程图如下图所示。DATASEGMENTXDB-25YDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;初始化MOVAL,X;X取到AL中CMPAL,0;Al中内容和0比较JGEBIG;大于等于0,转BIGMOVBL,-1;否则为负数,-1送BLJMPEXIT;转到结束位置BIG:JEEE;Al中内容是否为0,为0转EEMOVBL,1;否则为大于0,1送BLJMPEXIT;转到结束位置EE:MOVBL,0;0送BLEXIT:MOVY,BL;BL中内容送Y单元MOVAH,4CHINT21H;程序结束CODEENDSENDSTART;汇编结束【例5.5】试编一程序,求三个带符号字数据中的最大值,并将最大值存入MAX字单元中。设三个带符号数分别在三个字变量X、Y、Z中存储。程序流程图如下图所示STACKSEGMENTSTACKDB200DUP(0)STACKENDSDATASEGMENTXDW00ABHYDW–5ZDW200MAXDW?DATAENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AXMOVAX,XCMPAX,Y;X>Y?JGL1MOVAX,Y;Y>Z?CMPAX,ZJGEXITL2:MOVAX,ZJMPEXITL1:CMPAX,Z;X>Z?JLEL2EXIT:MOVMAX,AXMOVAH,4CHINT21HCODEENDSENDSTART【例5.6】设某程序有8路分支,试根据给定的N值(1~8),将程序的执行转移到其中的一路分支。程序流程如图下所示。DATASEGMENTTABDWP1,P2,P3,P4,P5,P6,P7,P8NDB5DATAENDSSTACKSEGMENTDB200DUP(0)STACKENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AX┆MOVAL,NDELALADDAL,ALMOVBL,ALMOVBH,0JMPTAB[BX]P1:……┆JMPEXITP2:……┆JMPEXITP2:……┆JMPEXITP3:……┆JMPEXIT┆P8:……┆EXIT:MOVAH,4CHINT21HCODEENDSENDSTART【例5.7】已知有几个元素存放在以BUF为首址的字节存贮区中,试统计其中正元素的个数。显然,每个元素为一个8位有符号二进制数,统计其中正元素的个数可用循环程序实现。其程序流程图如下图所示。例5.8】编写程序完成求1+2+3+……N的累加和,直到累加和超过1000为止。统计被累加的自然数的个数送CN单元,累加和送SUM。流程图如下图所示。DATASEGMENTSUMDW?CNDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;初始化MOVAX,0;0送AXMOVBX,0;0送BXLP:INCBX;BX加1ADDAX,BX;求累加和CMPAX,1000;比较JBELP;≤1000转MOVSUM,AXMOVCN,BX;送结果MOVAH,4CHINT21H;返回DOSCODEENDSENDSTART;汇编结束【例5.9】在以BUF为首址的字存储区中存放有N个有符号数,现需将它们按大到小的顺序排列在BUF存储区中,试编写其程序。我们采用冒泡排序算法从第一个数开始依次对相邻两个数进行比较,如次序对,则不交换两数位置;如次序不对则使这两个数交换位置。可以看出,第一遍需比较(N-1)次,此时,最小的数已经放到了最后;第二遍比较只需考虑剩下的(N-1)个数,即只需比较(N-2)次;第三遍只需比较(N-3)次,……整个排序过程最多需(N-1)遍。如下面的4个数即是采用冒泡排序比较的例子。数108169032第一遍101690328第二遍169032108第三遍903216108程序流程图如图5.9所示。DATASEGMENTBUFDW3,-4,6,7,9,2,0,-8,-9,-10,20N=($-BUF)/2DATAENDSSTACKSEGNMENTSTACKDB200DUP(0)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVCX,NDECCXLOOP1:MOVDX,CXMOVBX,0LOOP2:MOVAX,BUF[BX]CMPAX,BUF[BX+2]JGELXCHGAX,BUF[BX+2]MOVBUF[BX],AXL:ADDBX,2DECCXJNELOOP2MOVCX,DXLOOPLOOP1MOVAH,4CHINT21HCODEENDSENDSTART程序运行后,BUF区中的内容如下:20,9,7,6,3,2,0,-4,-8,-9,-10若要对N个无符号数按由大到小的顺序排列,只需将指令“JGEL”改为“JAEL”即可。【例5.10】将一个给定的二进制数按位转换成相应的ASCII码字符串,送到指定的存储单元并显示。如二进制数10010011转换成字符串为‘10010011’。要求将转换过程写成子程序,且子程序应具有较好的通用性,而必须能实现对8倍和16倍二进制数的转换。入口参数:DX存放待转换的二进制数CX存放待转换数的位数(8位或16位)DI存放ASCII码首地址出口参数:转换后的字符串存放在以DI作指针的字节存贮区中程序清单:DATASEGMENTNUM8DB93HNUM16DW0ABCDHASCBUFDB20DUP(0)DATAENDSCODESEGMENTASSUMEDS:DATA,CS:CODE,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVDX,0MOVDL,NUM8;转换二进制数送DXMOVCX,8;置位数8LEADI,ASCBUF;字符串首址→DICALLBTASC;调用子程序BTASCMOV[DI],BYTEPTR0DHMOV[DI+1],BYTEPTR0AHMOV[DI+2],BYTEPTR‘$’LEADX,ASCBUFMOVAH,9INT21HMOVDX,NUM16MOVCX,16;置位数16LEADI,ASCBUFCALLBTASCMOV[DL],BYTEPTR0DHMOV[DL+1],BYTEPTR0AHMOV[DL+2],BYTEPTR‘$’;显示转换后的字符串LEADX,ASCBUFMOVAH,9INT21HBTASCPROCPUSHAX;保存AXMOVAL,0CMPCX,8;比较8位数JNEL1;直接转换16位数MOVDH,DL;8位数转换送DHL1:ROLDX,,1;DX最高位移入CFRCLAL,1;CF移入AL最低位ADDAL,30HMOV[DI],ALINCDILOOPL1POPAXRETBTASCENDPCODEENDSENDSTART

1 / 11
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功