您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 建筑材料 > 微机原理与接口技术习题答案4
第4章汇编语言程序设计1.已知在BUF的起始处保存有N个字符的ASCII码,编写汇编语言程序实现,将这组字符串传送到缓冲区BUFR中,并且使字符串的顺序与原来的顺序相反。解:BUFDBBONJOUR_BELLEBUFRDB100DUP(?)MOVCX,NLEASI,BUFLEADI,BUFRADDDI,CXDECDIL1:MOVAL,[SI]MOV[DI],ALINCSIDECDILOOPL12.利用移位、传送和相加指令实现AX的内容扩大10倍。解:将扩大后的结果放在DX:AX中,注意到10×AX=8×AX+2×AX。XORDX,DXSHLAX,1RCLDX,1MOVBX,AXMOVCX,DXSHLAX,1RCLDX,1SHLAX,1RCLDX,1ADDAX,BXADCDX,CX3.在缓冲区VAR中连续存放着3个16位的无符号数,编写程序实现将其按递增关系排列;如果VAR中保存的为有符号数,则再编写程序实现将其按递减关系排列。解:VARDW1236,-432,3900XORSI,,SIMOVAX,VAR[SI]CMPAX,VAR[SI+2]JAEL1XCHGAX,VAR[SI+2]L1:CMPAX,VAR[SI+4]JAEL2XCHGAX,VAR[SI+4]L2:MOVVAR[SI],AXMOVAX,VAR[SI+2]CMPAX,VAR[SI+4]JAEL3XCHGAX,VAR[SI+4]L3:MOVVAR[SI+2],AX4.编写程序段实现将AL和BL中的每一位依次交叉,得到的16位字保存在DX中,例如(AL)=01100101B,(BL)=11011010B,则得到的(DX)=1011011010011001B。解:利用移位指令完成。XORDX,DXMOVCX,8L1:SHRAL,1RCRDX,1SHRBL,1RCRDX,1LOOPL15.在变量VAR1和VAR2中分别保存有两个字节型的正整数,编写完整的汇编语言程序实现:(1)当两数中有一个奇数时,将奇数存入VAR1,偶数存入VAR2;(2)当两数均为奇数时,两个变量的内容不变;(3)当两数均为偶数时,两数缩小一倍后存入原处。解:当VAR1为奇数时,不论VAR2的奇偶性,这两个单元的内容均不变;只有当VAR1为偶数时,如果VAR2为奇数,则VAR1与VAR2内容交换;如果VAR2为偶数,则两数缩小一倍后存入原处。DATASEGMENTVAR1DB28VAR2DB36DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATASTART:MOVAX,DATAMOVDS,AXMOVES,AXMOVAL,VAR1MOVBL,VAR2TESTAL,1JZEVEN1JMPOVEREVEN1:TESTBL,1JZEVEN2MOVVAR1,BLMOVVAR2,ALJMPOVEREVEN2:SHRAL,1MOVVAR1,ALSHRBL,1MOVVAR2,BLOVER:MOVAH,4CHMOVAL,0INT21HCODEENDSENDSTART6.已知在字变量VAR1、VAR2和VAR3中保存有3个相同的代码,但有一个错码,编写程序段找出这个错码,并将它送到AX,其地址送SI;如果3个代码都相同,则在AX中置-1标志。解:在数据段中定义:VAR1DW5A34HVAR2DW5A35HVAR3DW3A34H在代码段中编写程序段:MOVAX,-1MOVBX,VAR1CMPBX,VAR2JZL2CMPBX,VAR3JZL1MOVAX,BXLEASI,VAR1JMPOVERL1:MOVAX,VAR2LEASI,VAR2JMPOVERL2:CMPBX,VAR3JZOVERMOVAX,VAR3LEASI,VAR3OVER:7.分析下列程序段的功能:MOVCL,04SHLDX,CLMOVBL,AHSHLAX,CLSHRBL,CLORDL,BL解:程序段完成DX:AX组成的32位无符号数左移4位,低位补零(也即除以16)。8.下列程序段执行后,求BX寄存器的内容:MOVCL,3MOVBX,0B7HROLBX,1RORBX,CL解:实际上完成BX内容循环右移2位,因此,BX寄存器的内容为C02DH。9.下列程序段执行后,求BX寄存器的内容:MOVCL,5MOVBX,7D5CHSHRBX,CL解:完成BX内容逻辑右移5位,因此,BX寄存器的内容为03EAH。10.将BUFFERS中N个字按相反顺序传递到BUFFERT中。解:LEASI,BUFFERSLEADI,BUFFERTMOVCX,NADDDI,NADDDI,NSUBDI,2L1:MOVAX,[SI]MOV[DI],AXADDSI,2SUBDI,2LOOPL111.数组ARRAY中存放有一组字型数据,前两个字节存放数据长度(5的倍数)。为给这个数组中的数据进行加密保护,每5个数据取出一个数据进行加密处理:奇数位进行取反,偶数位不变,例如对数据0110110010110001B加密后变成1100011000011011B,编写加密程序encrpytion和解密程序unencrpytion。解:约定从第一个数据开始,每5个数据为一组,每组中的第一个数据采取加密/解密处理。由于加密算法采用的是取反操作,解密算法也采用取反操作,因此解密和解密算法是同一个程序。ENCRPYTIONPROCNEARLEASI,ARRAYXORDX,DXMOVAX,[SI]MOVBX,5DIVBXMOVCX,AXADDSI,2L1:MOVAX,[SI]XORAX,0AAAAHMOV[SI],AXADDSI,10LOOPL1RETENCRPYTIONENDP13.设BUF中存放有N个无符号数(或有符号数),编程实现求它们的最小值(存入AX)和最大值(存入DX)。解:BUF存放有N个无符号数的程序如下:MOVCX,N-1LEASI,BUFMOVAX,[SI]MOVDX,AXADDSI,2L1:CMPAX,[SI]JBENOCHG1XCHGAX,[SI]NOCHG1:CMPDX,[SI]JAENOCHG2XCHGDX,[SI]NOCHG2:ADDSI,2LOOPL1如果BUF中存放的是有符号数,则只需要将程序中的两行内容修改:JBENOCHG1改成:JLENOCHG1JAENOCHG2改成:JGENOCHG214.设BUFFER中存放有N个无符号(第1个字节存放缓冲区的长度),编程实现将其中的0元素抹去,并更新其长度。解:设BUFFER中存放的是字节型数据。采用双指针方法:SI为读指针,DI为写指针,从低地址开始,内存中读出一个字节,如果不为0,则写入内存;如果为0,则不进行写操作。LEASI,BUFFERXORCX,CXMOVCL,[SI]INCSIMOVDI,SIXORBH,BHXORAL,ALL1:CMP[SI],ALJZL2MOVBL,[SI]MOV[DI],BLINCDIINCBHL2:INCSILOOPL1MOVBUFFER,BH16.编写一个子程序实现统计AL中1的个数,然后检测出字节型缓冲区BUF中0和1个数相等的元素个数。解:统计AL中1的个数,只需将AL右移,移出的一位内容进行累加,子程序为:COUNTBYTEPROCNEARPUSHAXPUSHCXMOVCX,8XORBL,BLCOU1:SHRAL,1ADCBL,0LOOPCOU1POPCXPOPAXRETCOUNTBYTEENDP在此基础上,可以检测出字节型缓冲区BUF中0和1个数相等的元素个数,即一个字节中有4个1。设BUF中有N个字节型数据,结果保持在BH中。MOVCX,NLEASI,BUFXORBH,BHL1:MOVAL,[SI]CALLCOUNTBYTECMPBL,4JNZL2INCBHL2:INCSILOOPL119.在缓冲区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]INCDICALLSETEVENMOVAH,4CH;返回DOSMOVAL,0INT21HSETEVENPROCNEAR;加偶校验子程序PUSHAXPUSHBXPUSHCXPUSHDISETEVEN1:MOVAL,[DI]CALLCOUNTBYTEANDBL,01HJZSETEVEN2ORAL,80HMOV[DI],ALSETEVEN2:INCDILOOPSETEVEN1POPDIPOPCXPOPBXPOPAXRETSETEVENENDPCOUNTBYTEPROCNEARPUSHAXPUSHCXMOVCX,8XORBL,BLCOU1:SHRAL,1ADCBL,0LOOPCOU1POPCXPOPAXRETCOUNTBYTEENDPCODEENDSENDSTART20.编写程序完成求多位数(N个字)的绝对值。21.已知斐波那契数列的定义为:)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,2LOOPL1RETFIBONACCIENDP22.编写程序实现循环显示10条信息,保存每条信息的变量分别为INFOM1~INFORM10。解:在数据段中定义变量:TABLEDWINFORM1,INFORM2,INFORM3,INFORM4,INFORM5DWINFORM6,INFORM7,INFORM8,INFORM9,INFORM10在代码段中编写程序段:MOVCX,10XORSI,SIL1:MOVDX,TABLE[SI]MOVAH,9INT21HADDSI,2CALLWAITLOOPL1这里,WAIT为延时子程序,用于在显示信息之间的停顿。23.编写程序实现将包含20个数据的数组ARRAY分成两个数组:正数数组ARRAYP和负数数组ARRAYN,并分别将这两个数组中数据的个数显示出来。解:先编写一个子程序DISPALD,完成以3位十进制数形式显示出AL的内容。DISPALDPROCNEARPUSHAXPUSHCXPUSHDXXORAH,AHMOVCL,100DIVCLPUSHAXMOVDL,30HADDDL,ALMOVAH,2INT21HPOPAXMOVAL,AHXORAH,AHMOVCL,10DIVCLPUSHAXMOVDL,30HADDDL,ALMOVAH,2INT21HPOPAXMOVDL,30HADDDL,AHMOVAH,2INT21HPOPDXPOPCXPOPAXRETDISPALDENDP在此基础上,根据题目要求,需要用到3个指针:SI指向源数组ARRAY,DI指向正数数组ARRAYP,BX指向负数数组ARRAYN。MOVCX,20XORDX,DXLEASI,ARRAYLEADI,ARRAYPLEABX,ARRAYNL1:MOVAL,[SI]ANDAL,ALJSL2MOV[DI],ALINCDIINCDLJMPL3L2:MOV[BX],ALINCBXINCDHL3:INCSILOOPL1MOVAL,D
本文标题:微机原理与接口技术习题答案4
链接地址:https://www.777doc.com/doc-2469788 .html