-0-微机原理与接口技术答案注:以下程序均经过上机验证过,可完美实现。。。祝大家好运。。。。。。。1.已知在BUF的起始处保存有N个字符的ASCII码,编写汇编语言程序实现,将这组字符串传送到缓冲区BUFR中,并且使字符串的顺序与原来的顺序相反。解:BUFDB'chen_xiaobo'BUFRDB100DUP(?)MOVCX,11LEASI,BUFLEADI,BUFRADDDI,CXDECDIL1:MOVAL,[SI]MOV[DI],ALINCSIDECDILOOPL14编写程序段实现将AL和BL中的每一位依次交叉,得到的16位字保存在DX中,例如(AL)=01100101B,(BL)=11011010B,则得到的(DX)=1011011010011001B。解:(AL)=01010011B=53H(BL)=01100101B=65H(DX)=0011100100100111B=3927HMOVAL,53HMOVBL,65HXORDX,DX-1-MOVCX,8L1:SHRAL,1RCRDX,1SHRBL,1RCRDX,1LOOPL17分析下列程序段的功能:MOVCL,04SHLDX,CLMOVBL,AHSHLAX,CLSHRBL,CLORDL,BL解:程序段完成DX:AX组成的32位无符号数左移4位,低位补零。如(AX)=0011100100100111B=3927H(DX)=0101001101100101B=5365H运行前DX:AX组成53653927H,运行后DX:AX组成36539270HMOVAX,3927HMOVDX,5365H;自己添加的程序MOVCL,04SHLDX,CLMOVBL,AHSHLAX,CLSHRBL,CLORDL,BL8下列程序段执行后,求BX寄存器的内容:MOVCL,3-2-MOVBX,0B7HROLBX,1RORBX,CL解:BX内容循环右移2位,(BX)=C02DH。9下列程序段执行后,求BX寄存器的内容:MOVCL,5MOVBX,7D5CHSHRBX,CL解:BX内容逻辑右移5位,(BX)=03EAH。10将BUFFERS中N个字按相反顺序传递到BUFFERT中。解:BUFFERSDW'x','i','b','o'BUFFERTDW100DUP(?)LEASI,BUFFERSLEADI,BUFFERTMOVCX,4ADDDI,8SUBDI,2L1:MOVAX,[SI]MOV[DI],AXADDSI,2SUBDI,2LOOPL111数组ARRAY中存放有一组字型数据,前两个字节存放数据长度(5的倍数)。为给这个数组中的数据进行加密保护,每5个数据取出一个数据进行加密处理:奇数位进行取反,偶数位不变,例如对数据0110110010110001B加密后变成1100011000011011B,编写加密程序encrpytion和解密程序-3-unencrpytion。解:约定从第一个数据开始,每5个数据为一组,每组中的第一个数据采取加密/解密处理。由于加密算法采用的是取反操作,解密算法也采用取反操作,因此解密和解密算法是同一个程序。注:当0110110010110001B=6CB1H,加密后变成C61BH0001000100010001B=1111H加密后为BBBBHSTACKSEGMENTSTACK'STACK'DW100HDUP(0)TOPLABELWORDSTACKENDSDATASEGMENTAPPAYDW000AH,6CB1H,5678H,4321H,3456H,3412H,1111H,9321H,4332H,6645H,8543HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AXLEASP,TOPCALLENCRPYTIONENCRPYTIONPROCNEARLEASI,APPAYXORDX,DXMOVAX,[SI]-4-MOVBX,5DIVBXMOVCX,AXADDSI,2L1:MOVAX,[SI]XORAX,0AAAAHMOV[SI],AXADDSI,10LOOPL1RETENCRPYTIONENDP13.设BUF中存放有N个无符号数(或有符号数),编程实现求它们的最小值(存入AX)和最大值(存入DX)。解:DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AXLEASP,TOPMOVCX,5LEASI,BUFMOVAX,[SI]MOVDX,AX-5-ADDSI,2L1:CMPAX,[SI]JBENOCHG1;小于等于的时候转移,有符号数为JLEXCHGAX,[SI]NOCHG1:CMPDX,[SI]JAENOCHG2;大于的时候转移,有符号数位JGEXCHGDX,[SI]NOCHG2:ADDSI,2LOOPL1CODEENDSENDSTART16.编写一个子程序实现统计AL中1的个数,然后检测出字节型缓冲区BUF中0和1个数相等的元素个数。解:STACKSEGMENTSTACK'STACK'DW100HDUP(0)TOPLABELWORDSTACKENDSDATASEGMENTBUFDB11110000B,10101111B,01010101B,10101011B,11100011BDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVES,AX-6-MOVAX,STACKMOVSS,AXLEASP,TOPMOVCX,5;BUF中的个数保存在BH里面LEASI,BUFXORBH,BHL1:MOVAL,[SI]CALLCOUNTBYTECMPBL,4;BL为1的个数,不为4调转.为4,SI加1JNZL2INCBHL2:INCSILOOPL1;AL中1的个数结果保存在BL里面COUNTBYTEPROCNEARPUSHAXPUSHCXMOVCX,8XORBL,BLCOU1:SHRAL,1ADCBL,0LOOPCOU1POPCXPOPAXRETCOUNTBYTEENDP-7-HUIDOS:MOVAH,4CHINT21HCODEENDSENDSTART19.在缓冲区BUFFER中,第1个字节存放数组的长度(256),从第2个字节开始存放字符的ASCII码,编写子程序完成在最高位给字符加上偶校验。解:STACKSEGMENTSTACK'STACK'DW100HDUP(?)TOPLABELBYTESTACKENDSDATASEGMENTBUFFERDB3;首字节为字符串长度DB'ABC';字符串DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,STACKMOVSS,AXLEASP,TOPMOVAX,DATAMOVDS,AXMOVES,AXLEADI,BUFFERXORCX,CXMOVCL,[DI]INCDICALLSETEVEN-8-MOVAH,4CH;返回DOSMOVAL,0INT21HSETEVENPROCNEAR;加偶校验子程序PUSHAXPUSHBXPUSHCXPUSHDISETEVEN1:MOVAL,[DI]CALLCOUNTBYTEANDBL,01HJZSETEVEN2ORAL,80HMOV[DI],ALSETEVEN2:INCDILOOPSETEVEN1POPDIPOPCXPOPBXPOPAXRETSETEVENENDPCOUNTBYTEPROCNEARPUSHAXPUSHCXMOVCX,8XORBL,BLCOU1:-9-SHRAL,1ADCBL,0LOOPCOU1POPCXPOPAXRETCOUNTBYTEENDPCODEENDSENDSTART21.已知斐波那契数列的定义为:)3(,1,12121iFFFFFiii,编写求该数列前n项的子程序。解:设奖斐波那契数列存放在字变量RESULT中。在数据段中定义RESULTDW100HDUP(?)在代码段中编写子程序FIBONACCIPROCNEARXORDI,DIMOVRESULT[DI],1;前两个数为1MOVRESULT[DI+2],1ADDDI,4MOVCX,NL1:MOVAX,RESULT[DI-4]ADDAX,RESULT[DI-2]MOVRESULT[DI],AXADDDI,2LOOPL1RETFIBONACCIENDP-10-25.编写程序实现求级数22221n的前n项和刚大于2000的项数n。解:BL用于存放项数。STACKSEGMENTSTACK'STACK'DW100HDUP(?)TOPLABELWORDSTACKENDSDATASEGMENTDB100HDUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AXLEASP,TOPMOVBL,1MOVCX,0COUNT:MOVAL,BLMULBLADDCX,AXCMPCX,2000JAEXITINCBLJMPCOUNT-11-EXIT:35.编程实现将STRING字符串中的小写字母变换成大写字母。解:设STRING中的字符个数为N。MOVCX,NLEASI,STRINGMOVAL,5FHL1:AND[SI],ALINCSILOOPL137.(上机题)编写程序实现,将缓冲区BUFFER中的100个字按递增排序,并按下列格式顺序显示:数据1原序号数据2原序号……答案一STACKSEGMENTSTACK'STACK'DW100HDUP(?)TOPLABELWORDSTACKENDSDATASEGMENTYUANLAIDW777,11,666,222,111,333,444,587,234,4524HOULAIDW10DUP(0)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AX-12-MOVES,AXMOVAX,STACKMOVSS,AXLEASP,TOPMOVCX,10LEASI,YUANLAILEADI,HOULAIL1:MOVAX,[SI]ADDSI,2MOV[DI],AXADDDI,2LOOPL1;循环10次,将原来的复制给后来的数据MOVCX,9LEASI,YUANLAIPUSHCXADDCX,CXADDSI,CXPOPCXL2:PUSHCXPUSHSIL3:MOVAX,[SI]CMPAX,[SI-2]JAENOXCHG;AX大于[SI-2]的时候跳转XCHGAX,[SI-2]-13-MOV[SI],AXNOXCHG:SUBSI,2LOOPL3POPSIPOPCXLOOPL2;冒泡法进行排序MOVCX,10LEASI,YUANLAIL4:MOVAX,[SI]CALLXIANSHIADDSI,2CALLZUOCALLXUHAOCALLYOUCALLHUICHELOOPL4MOVAH,4CHMOVAL,0INT21H-14-XIANSHIPROCNEAR;显示的程序,输出的数据PUSHAXPUSHBXPUSHCXPUSHDXPUSHDIMOVBX,10MOVCX,3L7:XORDX,DXDIVBXMOV[DI],DXINCDIINCDILOOPL7MOVCX,3L8:DECDIDECDIMOVAL,[DI]ADDAL,30H;1的ASCII码是31H,加上30HMOVAH,02MOVDL,ALINT21HLOOP