《微机系统与接口技术》汇编补充作业1.寻址方式小结。请根据已填的格式,完成下面表中的空白部分:寻址方式操作数物理地址(PA)指令格式举例立即寻址操作数由指令给出MOVDX,100H;(DX)←100寄存器寻址操作数在寄存器中MOVAX,BX;(AX)←(BX)直接寻址操作数的有效地址由指令直接给出MOVAX,[1234H]寄存器间接寻址(BX)PA=(DS)×16+(SI)(DI)或=(SS)×16+(BP)MOVAX,[BX]MOVAX,[SI]MOVAX,[DI]MOVAX,[BP]基址寻址PA=(DS)×16+(BX)+位移量PA=(SS)×16+(BP)+位移量MOVAX,BUFF[BX]MOVAX,BUFF[BP]变址寻址PA=(DS)×16+(SI)+位移量PA=(DS)×16+(DI)+位移量MOVAX,BUFF[SI]MOVAX,BUFF[DI]基址变址寻址PA=(DS)×16+(BX)+(SI)PA=(DS)×16+(BX)+(DI)PA=(SS)×16+(BP)+(SI)PA=(SS)×16+(BP)+(DI)MOVAX,[BX][SI]MOVAX,[BX+DI]MOVAX,[BP][SI]MOVAX,[BP+DI]基址变址相对寻址PA=(DS)×16+(BX)+(SI)+位移量PA=(DS)×16+(BX)+(DI)+位移量PA=(SS)×16+(BP)+(SI)+位移量PA=(SS)×16+(BP)+(DI)+位移量MOVAX,BUFF[BX][SI]MOVAX,BUFF[BX+DI]MOVAX,BUFF[BP][SI]MOVAX,BUFF[BP+DI]2.指出下列8088指令的错误:(1)MOVAH,BX(2)MOV[BX],[SI](3)MOVAX,[SI][DI](4)MOVMYDAT[BX][SI],ES:AX(5)MOVBL,1000(6)MOVCS,AX(7)MOVDS,BP(8)XLATBX(9)INAX,0382H(10)OUTAX,20H答:(1)两个操作数长度不一致(2)两个操作数不能都是存储器操作数(3)变址寻址方式不能使用两个变址寄存器(4)寄存器寻址没有段超越用法(5)两个操作数长度不一致(或1000超出字节数据范围)(6)CS不能做目的寄存器(7)段寄存器只能由通用寄存器对其操作,BP不能对通用寄存器进行操作(8)XLAT中BX是隐含操作数(9)IN指令中16位端口地址要用DX作为操作数(10)OUT指令两个操作数反了3.按要求编写下面的程序段1)利用移位指令计算DX=3×AX+7×BX,假设为无符号数运算,无进位。2)用逻辑运算指令实现数字0~9的ASCII码与非压缩BCD码的互相转换3)把DX.AX中的双字右移4位4)假设从4A00H:0000开始的4个字节中存放了4个非压缩的BCD码,现在按照低地址对低位,高地址对高位的原则,将他们合并到DX中。答:1)MOVCX,AXSHLAX,1;AX*2ADDAX,CX;AX*3MOVDX,BXMOVCL,3SHLDX,CL;BX*8SUBDX,BX;BX*7ADDDX,AX2)MOVAL,’0’LOP:ANDAL,0FHINCALCMPAL,‘:’JNELOPMOVAL,0LOP1:ORAL,30HINCALCMPAL,0AHJNELOP13)MOVCL,4SHRAX,CLMOVBL,DLSHRDX,CLSHLBL,CLORAH,BL4)MOVAX,4A00HMOVDS,AXMOVCL,4MOVSI,0MOVAL,[SI]ANDAL,0FHMOVDL,ALINCSIMOVAL,[SI]SHLAL,CLORDL,ALINCSIMOVAL,[SI]ANDAL,0FHMOVDH,ALINCSIMOVAL,[SI]SHLAL,CLORDH,AL4.请说明下面两段程序的功能1)movsi,600hmovdi,601hmovax,dsmoves,axmovcx,256stdrepmovsb2)cldmovax,0fefhmovcx,5movbx,3000hmoves,bxmovdi,2000hrepstosw答:1)从DS:600H开始将向低地址方向的256字节向高地址移动一个字节位置。2)从3000:2000h开始连续存放5个0fefh5.假设DS=2000H.BX=1256H,SI=528FH,位移量TABLE=20A1H,[232F7H]=3280H,[264E5H]=2450H,试问执行下列段内间接寻址的转移指令后,转移到有效地址是什么?i.JMPBXii.JMPTABLE[BX]iii.JMP[BX][SI]答:(1)1256H(2)3280H(3)2450H6.判断下列程序段跳转到条件(1)XORAX,1E1EHJEEQUAL(2)TESTAL,10000001BJNZTHERE(3)CMPCX,64HJBTHERE答:(1)(AX)=1E1EH(2)(AL)的最高位和/或最低位为1(3)(CX)64H7.如果条件跳转指令的跳转目标范围超出-128~127的范围,该如何处理?举例说明。答:可以把跳转条件做一些调整,利用无条件跳转的跳转范围大,来达到目的,如:CMPAX,33JELONG……;大于127字节LONG:改为:CMPAX,33JNESHOETERJMPLONGSHORTER:……;大于127字节……LONG:8.按要求编写下面的程序段1)当DX高4位全为0时,使AX=0,否则AX=-1。2)已知字符串string包含有256BYTE的内容,将其中所有的‘$’符号替换成空格(‘’)。3)所谓回文字符串是指一个字符串正读和倒读都是一样的,例如字符串‘ABCDEFFEDCBA’就是一个回文字符串,而字符串‘ABCFDDCAB’就不是回文字符串。现在有一个字符串string,包含有16个字节的内容,请编写程序段,判断该字符串是否为回文字符串。4)统计以‘$’字符结束的字符串string的字符个数。答:1)TESTDX,0F0HJZOK1XORAX,AXJMPOK2OK1:MOVAX,-1Ok2:…2)MOVCX,256MOVAL,‘$’MOVAH,‘’LEABX,stringLP:CMP[BX],ALJNZNEXTMOV[BX],AHNEXT:INCBXDECCXJNZLP3)LEASI,stringMOVDI,15ADDDI,SILP:MOVAL,[SI]CMPAL,[DI]JNZNO;不是回文INCSIDECDICMPSI,DIJBLP……;是回文NO:……;不是回文4)MOVCX,0;放字符个数LEASI,stringLP:MOVAL,[SI]CMPAL,’$’JEEXITINCSIINCCXJMPLPEXIT:9.设置CX=0,则LOOP指令将执行多少次?例如:movcx,0delay:loopdelay答:将执行65536次10.在下面程序段的括号中如果分别放上下面的指令(1)LOOPL20(2)LOOPNEL20(3)LOOPEL20试说明,当程序执行完时AX,BX,CX,DX四个寄存器的内容分别是什么?MOVAX,01MOVBX,02MOVCX,03MOVDX,04L20:INCAXADDBX,AXSHRDX,1()RET答:(1)(AX)=4,(BX)=11,(CX)=0,(DX)=0(2)(AX)=4,(BX)=11,(CX)=0,(DX)=0(3)(AX)=2,(BX)=4,(CX)=2,(DX)=211.下面两条短转移指令的转移地址A10和A20分别是多少?(用16进制来表示)(1)0110EBF7JMPA10(2)0110EB09JMPA20指令地址(16进制)指令码汇编语句答:(1)A10=0109H(2)A20=011BH12.按要求编写下面的程序段1)将ELEMS中的100个字节数据的位置颠倒过来(即第一个字节和第100个字节的内容交换,第二个字节和第99个字节的内容交换……)。2)有两个3位的ASCII码字串ASC1和ASC2定义如下:ASC1DB‘578’ASC2DB‘694’ASC3DB‘0000’请编写计算ASC3=ASC1+ASC2的程序段。3)编写四字节ASCII码串‘3785’与ASCII数码‘5’相乘的程序段。答:1)LEASI,ELEMSMOVDI,SIADDDI,99MOVCX,50LP:MOVAL,[SI]XCHGAL,[DI]XCHGAL,[SI]INCSIDECDIDECCXJNZLP2)CLC;清CFPUSHFLEASI,ASC1+2;从个位开始加,DB'578'等同于DB'5','7','8'LEADI,ASC2+2LEABX,ASC3+3MOVCX,3;计算的数有位A20:MOVAH,0MOVAL,[SI]SUBAL,30H;;ASCII码转BCD码MOVDL,[DI]SUBDL,30H;ASCII码转BCD码POPFADCAL,DLAAA;非压缩BCD码加法调整PUSHFADDAL,30H;BCD码转ASCII码MOV[BX],ALDECSIDECDIDECBXLOOPA20POPFADDAH,30HMOV[BX],AH3)MOVCX,4LEASI,MULCND+3LEADI,PRODUCT+4ANDMULPLR,0FH;ASCII码转BCD码A30:MOVAL,[SI]ANDAL,0FH;ASCII码转BCD码MULMULPLRAAM;BCD码乘调整ADDAL,[DI]AAA;BCD码加法调整ORAL,30HMOV[DI],ALDECDIMOV[DI],AHDECSILOOPA30ORBYTEPTR[DI],30H13.请编写完整程序在一个升序字节数组中查找数N,找到后将此数从数组中删除,并使得CF=0;没找到返回CF=1。数组的首地址和末地址为A_HEAD和A_END。答:DATASEGMENTPARA'DATA'A_HEADDW?BUFFDB1,2,3,4,5,6,7,8,9,0COUNTEQU$-BUFFA_ENDDW?NDB4DATAENDSCODESEGMENTPARA'CODE'ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,OFFSETBUFFMOVA_HEAD,SIMOVAL,COUNTCBWADDAX,SIMOVDI,AXDECDIMOVA_END,DIMOVAL,NLP:CMPAL,[SI]JNENEXTJMPDELNEXT:INCSI;考察下一个数据CMPSI,DIJBELP;循环STC;CF-1JMPEXITDEL:CLC;CF-0CMPSI,DIJNEDELDATADECA_END;删除的是最后一个元素JMPEXITDELDATA:MOVCX,DISUBCX,SILP2:MOVAL,[SI+1];该循环将SI+1到DI位置的数据移动到SI到DI-1的位置MOV[SI],ALINCSILOOPLP2DECA_END;调整结尾指针EXIT:MOVAH,4CHINT21HCODEENDSENDSTART14.请编写完整程序从键盘读取字符,如果是十进制的‘0’~‘9’则在屏幕上输出该数的8位二进制码,并将数字依次存放到BUF开头的数组中,如果读入的字符是’Q’或者‘q’,则程序退出,其他情况在屏幕上打印“Youmustinput0~9,or‘q’or‘Q’”。(如输入的字符是‘9’,则输出“00001001”)提示:语句“Youmustinput0~9,or‘q’or‘Q’”定义成以’$’结尾的字符串,键盘输入和屏幕输出,请参看教材后的DOS功能调用(int21h)的相关功能。输出一个数的2进制形式应该从最高位开始输出,可以将此段程序定义成一个过程。答:;'Youmustinput0~9,or'q'or'Q'。DATASEGMENTPARA'DATA'sentencedb'Youmustinput0~9,orqorQ\','$'bufdb20dup(?)DATAEND