DATASEGMENTmess1DB'Enterkeyword:','$'mess2DB'EnterSentence:','$'mess3DB'Matchatlocation:','$'mess4DB'NOTMATCH.',13,10,'$'mess5DB'Hifthesentence',13,10,'$'changeDB13,10,'$'stoknin1labelbytemax1db10act1db?stokn1db10dup(?)stoknin2labelbytemax2db50act2db?stokn2db50dup(?)DATAENDSSTACKSSEGMENT;此处输入堆栈段代码STACKSENDSCODESEGMENT;*************************************代码段mainprocfarassumecs:code,ds:data,es:dataSTART:pushdssubAX,AXsubBX,BXsubDI,DIsubSI,SIpushAX;为返回dos并清空后面要用到的寄存器MOVAX,DATAMOVDS,AXLEADX,mess1MOVah,09INT21h;输出EnterkeywordLEADX,stoknin1MOVah,0ah;用21号中段的0ah号功能获取关键字INT21hcmpact1,0jeexit;如果为空直接退出程序a10:;********************************输入Sentence并判断LEADX,changeMOVah,09INT21hLEADX,mess2MOVah,09INT21hLEADX,stoknin2MOVah,0ahINT21hMOVAL,act1CBWMOVCX,AXPUSHCXMOVAL,act2cmpAL,0jea50SUBAL,act1jsa50INCALCBWLEABX,stokn2MOVDI,0MOVSI,0;输出回程,换行;输出EnterSentence:;用21号中段的0ah号功能获取句子;保存关键字长度到cx;cx入栈;保存句子长度到al,若句子为空则跳转显示notmatch;若句子长度小于关键字长度,则跳转显示notmatch;将句子的首地址放进BXa20:;****************************************比较,内循环MOVAH,[BX+DI]CMPAH,stokn1[SI];遇见字符不相等就跳转到a30jnea30INCDIINCSIDECCX;没遇到一个相等的字符,cx-1,cx不为0则比较下一个字符,当cx为0是说明关键字比较完CMPCX,0jea40jmpa20a30:;*****************************************外循环,BX+1,清空si,di继续内循环比较INCBXDECALcmpAL,0jea50MOVDI,0MOVSI,0POPCXpushCXjmpa20a40:;*****************************************match,将bx减去句子的首地址加一得到关键字所在位置,调用二进制转十六进制子函数将位置输出SUBBX,offsetstokn2INCBXLEADX,changeMOVah,09INT21hLEADX,mess3MOVah,09INT21hCALLbtohLEADX,mess5MOVah,09INT21hjmpa10;****************************************二进制转换十六进制btohPROCNEARMOVCH,4rotate:MOVCL,4ROLBX,CLMOVAL,BLandAL,0fhaddAL,30hcmpal,3ahjlprintitaddal,7hprintit:MOVdl,alMOVah,2int21hdecchjnzrotateretbtohendpa50:;*****************************************显示notmatchLEADX,changeMOVah,09INT21hLEADX,mess4MOVah,09INT21hjmpa10exit:retmainendpCODEENDSENDSTART