程汇题例序言语编.精品文档【例5.1】试编写一程序计算以下表达式的值。
w=(v-(x*y+z-540))/x式中x、y、z、v均为有符号字数据。
设x、y、z、v的值存放在字变量X、Y、Z、V中,结果存放在双字变量W之中,程序的流程图如图5.1所示。
DATA SEGMENTDW 200 XDW Y 100DW Z 3000DW V 10000DW2 DUP(?)WDATA ENDSSTACK SEGMENT STACKDB 200 DUP(0)STACK ENDS收集于网络,如有侵权请联系管理员删除.精品文档CODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACK START:MOV AX,DATAMOV DS,AX ;DATA→AXX ,MOV AXAX (*Y)→DX:IMUL Y;(X)MOV CX,AXMOV BX,DX ;(DX:AX)→(BX:CX)Z ,MOV AX )符号扩展;(Z CWDADD CX ,AXADC BX,DX;(BX :CX)+(DX:AX)→(BX:CX)SUB CX,540SBB BX,0 ;(BX:CX )-540→(BX:CX)V,MOV AX CWD ;(V)符号扩展SUB AX,CXSBB DX,BX;(DX:AX)-(BX:CX)→(DX:AX);(DX:AX )/XIDIV XMOV W,AX ;商→W;余数DXMOV W+2,DX→W+2收集于网络,如有侵权请联系管理员删除.精品文档MOV AH,4CHINT 21HENDS;退出DOS 状态CODEEND START【例5.2】已知某班学生的英语成绩按学号(从1开始)从小到大的顺序排列在TAB表中,要查的学生的学号放在变量NO中,查表结果放在变量ENGLISH中。
编写程序如下:STACK SEGMENT STACKDB200 DUP(0)STACK ENDSDATA SEGMENTTAB DB 80,85,86,71,79,96DB 83,56,32,66,78,84NODB 10DB ?ENGLISTDATA ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODEBEGIN:MOV AX,DATAMOV DS ,AXLEA BX,TABMOV AL,NODEL ALXLAT TABMOV ENGLISH,ALMOV AH,4CHINT 21HCODEENDS收集于网络,如有侵权请联系管理员删除.精品文档END BEGIN【例5.3】已知在内存中有一个字节单元NUM,存有带符号数据,要求计算出它的绝对值后,放入RESULT单元中。
题目分析:根据数学中绝对值的概念知道,一个正数的绝对值是它本身,而一个负数的绝对值是它的相反数;要计算一个数的相反数,需要完成减法运算,即用0减去这个数。
8086/8088指令系统中有专门的求相反数的指令NEG。
DATA SEGMENTX DB -25RESULT DB ?DATA ENDSCODE SEGMENTASSUME DS:DATA,CS:CODESTART: MOV AX,DATAMOV DS,AX;初始化MOV AL,X ;X取到AL中;测试AL正负TEST AL,80HJZ NEXT ;为正,转NEXT收集于网络,如有侵权请联系管理员删除.精品文档NEG AL ;否则AL求补NEXT: MOV RESULT,AL ;送结果MOV AH,4CHINT 21H ;返回DOSCODE ENDSEND START【例5.4】编写计算下面函数值的程序:1 X>0Y= 0 X=0-1X<0设输入数据为X、输出数据Y,且皆为字节变量。
程序流程图如下图所示。
DATA SEGMENTX DB -25Y DB ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA收集于网络,如有侵权请联系管理员删除.精品文档MOV DS,AX ;初始化MOV AL,X ;X取到AL中CMP AL,0 ;Al中内容和0比较JGEBIG;大于等于0,转BIGMOV BL,-1 ;否则为负数,-1送BLJMPEXIT ;转到结束位置EE;Al中内容是否为0,为0转EEBIG: JEMOV BL,1 ;否则为大于0,1送BLJMPEXIT ;转到结束位置BL,0 ;0送BLEE:MOVEXIT: MOV Y,BL ;BL中内容送Y单元MOV AH,4CHINT 21H ;程序结束CODE ENDS;汇编结束END START【例5.5】试编一程序,求三个带符号字数据中的最大值,并将最大值存入MAX 字单元中。
中存储。
程序流程图如下图Z、Y、X设三个带符号数分别在三个字变量所示收集于网络,如有侵权请联系管理员删除.精品文档STACK SEGMENT STACKDB 200 DUP(0)STACK ENDSDATA SEGMENTX DW 00ABHY DW –5DW 200ZDW ?MAXDATA ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODESTART:MOV AX,DATAMOV DS,AX,X MOV AX Y;AX,Y X>?CMPL1JG;MOV AX ZY>?,YCMP AX ,ZJGEXITL2:MOV AX,ZJMP EXIT收集于网络,如有侵权请联系管理员删除.精品文档L1:CMP AX,Z ;X>Z?L2JLEEXIT:MOV MAX,AXAH,4CHMOVINT 21HCODE ENDSEND START【例5.6】设某程序有8路分支,试根据给定的N值(1~8),将程序的执行转移到其中的一路分支。
程序流程如图下所示。
DATA SEGMENTTAB DW P1,P2,P3,P4,P5,P6,P7,P8N DB 5DATA ENDSSTACK SEGMENTDB 200 DUP(0)STACK ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODE收集于网络,如有侵权请联系管理员删除.精品文档START:MOV AX,DATAMOV DS,AX┆MOV AL,NDEL ALADD AL,ALMOV BL,ALMOV BH,0JMP TAB[BX]P1:……┆JMP EXITP2:……┆JMP EXITP2:……┆JMP EXITP3:……┆JMP EXIT┆P8:……┆EXIT:MOV AH,4CHINT 21HCODE ENDSEND START【例5.7】已知有几个元素存放在以BUF为首址的字节存贮区中,试统计其中正元素的个数。
收集于网络,如有侵权请联系管理员删除.精品文档显然,每个元素为一个8位有符号二进制数,统计其中正元素的个数可用循环程序实现。
其程序流程图如下图所示。
例5.8】编写程序完成求1+2+3+……N的累加和,直到累加和超过1000。
流程图如下图SUMCN为止。
统计被累加的自然数的个数送单元,累加和送所示。
收集于网络,如有侵权请联系管理员删除.精品文档DATA SEGMENTSUM DW ?CN DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AX ;初始化;0 送MOV AX,0AXMOV BX,0 ;0送BXLP: INC BX ;BX加1ADD AX,BX ;求累加和;比较CMP AX,1000JBE LP ;≤1000转MOV SUM,AXMOV CN,BX;送结果MOV AH,4CHINT 21H ;返回DOSCODE ENDSEND START;汇编结束【例5.9】在以BUF为首址的字存储区中存放有N个有符号数,现需将它们按大到小的顺序排列在BUF存储区中,试编写其程序。
收集于网络,如有侵权请联系管理员删除.精品文档我们采用冒泡排序算法从第一个数开始依次对相邻两个数进行比较,如次序对,则不交换两数位置;如次序不对则使这两个数交换位置。
可以看出,第一遍需比较(N-1)次,此时,最小的数已经放到了最后;第二遍比较只需考虑剩下的(N-1)个数,即只需比较(N-2)次;第三遍只需比较(N-3)次,……整个排序过程最多需(N-1)遍。
如下面的4个数即是采用冒泡排序比较的例子。
数10 8 16 90 32第一遍8 16 190 32 0第二遍8 90 132 6 10第三遍32891610程序流程图如图5.9所示。
收集于网络,如有侵权请联系管理员删除.精品文档DATA SEGMENTDW 3,-4,6,7,9,2,0,-8BUF ,-9,-10,20 N= ($-BUF)/2DATA ENDSSTACK SEGNMENT STACKDB 200 DUP(0)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATAMOV DS,AXMOV CX,NDEC CXLOOP1:MOV DX,CXMOV BX,0LOOP2:MOV AX,BUF[BX]CMP AX,BUF[BX+2]JGELXCHG AX,BUF[BX+2]MOV BUF[BX],AXADD BX,2L:DEC CXJNE LOOP2收集于网络,如有侵权请联系管理员删除.精品文档MOV CX,DXLOOP LOOP1MOV AH ,4CHINT 21HCODE ENDSEND START程序运行后,BUF区中的内容如下:20,9,7,6,3,2,0,-4,-8,-9,-10若要对N个无符号数按由大到小的顺序排列,只需将指令“JGE L”改为“JAE L”即可。
【例5.10】将一个给定的二进制数按位转换成相应的ASCII码字符串,送到指定的存储单元并显示。
如二进制数10010011转换成字符串为‘10010011'。
要求将转换过程写成子程序,且子程序应具有较好的通用性,而必须能实现对8倍和16倍二进制数的转换。
入口参数:DX存放待转换的二进制数CX存放待转换数的位数(8 位或16位)DI 存放ASCII码首地址出口参数:转换后的字符串存放在以DI作指针的字节存贮区中程序清单:DATA SEGMENTNUM8 DB 93HNUM16 DW 0ABCDH20DUP(0)ASCBUFDBDATAENDS收集于网络,如有侵权请联系管理员删除.精品文档CODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV DX,0MOV DL,NUM8 ;转换二进制数送DX;置位数8 8MOV CX,LEA DI,ASCBUF ;字符串首址→DICALL BTASC;调用子程序BTASCMOV [DI] ,BYTE PTR 0DHMOV [DI+1] ,BYTE PTR 0AH[DI+2],BYTE PTR ‘$'MOVLEA DX,ASCBUFMOV AH,9INT21HMOV DX,NUM16MOV CX,16;置位数16LEA DI ,ASCBUFCALL BTASCMOV [DL],BYTE PTR 0DHMOV [DL+1],BYTE PTR 0AHMOV [DL+2],BYTE PTR ‘$';显示转换后的字符串LEA DX,ASCBUF收集于网络,如有侵权请联系管理员删除.精品文档MOV AH,9INT 21HBTASC PROCPUSH AX;保存AXMOV AL,0CMP CX ,8 ;比较8位数JNEL1;直接转换16 位数;8位数转换送DHMOV DH,DLL1:DX最高位移入CFROL DX,,1;RCL AL,1 ;CF移入AL最低位ADD AL ,30HMOV [DI],ALINC DILOOP L1POP AXRETBTASC ENDPCODE ENDSEND START收集于网络,如有侵权请联系管理员删除.。