汇编语言程序设计习题解答.docx
汇编语言程序设计习题解答1.指出以下指令的错误:(I)MOVAH,BX(2)MOVBX,SI(3)MOVAX,SIDI(4)MOVMYDATBXSI,ES:AX(5)MOVBYTEPTRBX,1000(6)MOVBX,OFFSETMYDATSI(7)MOVCS,AX答:MOVAH,BXAH为八位,BX为16位(2) MOVBX,SI两个操作数不能都是存储单元(3) MOVAX,SIDI一个操作数中不能用两个变址存放器(4) MOVMYDATBXSI,E8:AXESES后应为一个变址存放器,表示偏移量(5) MOVBYTEPTRBX,1000BYTE说明时BX进行字节操作。而1000为字(6) MOVBX,OFFSETMYDATSIOFFSET为取某个地址的偏移量,故后面不应用SI,而应是一个符号地址。(7) fOV是数据寻址,不应用程序段存放器CS.2.下面哪些指令是非法的?(假设0P1,0P2是已经用DB定义的变量)(I)CMP15,BX(2)CMP0Pl,25(3)CMPOPb0P2(4)CMPAX,OPl答:(1)CMP15,BX非法,两个操作数不能一个为字,一个为字节(2) CMPOPb25正确(3) CMPOPb0P2正确(4) CMPAX,OPl非法,两操作数不能一个为字,一个为字节3.假设以下指令中的所有标识符均为类型属性为字的变量,请指出以下指令中哪些是非法的?它们的错误是什么?(I)MOVBP,AL(2)MOVW0RD_0PBX+4*3DI,SP(3)MOVWORD_OP1,WORDj)P2(4)MOVAX,WORD_OP1DX(5)MOVSAVE_WORD,DS(6)MOVSP,SS:DATA_WORDBXSI(7)MOVBXSI,2(8)MOVAX,WORD_OP1+WORD_OP2(9)MOVAX,WORD_OPl-WORDJ)P2+100(IO)MOVWORD_0Pl,WORD_OP1-WORD_OP2答:(1)MOVBP,AL非法,BP为16位AL为八位(2) MOVW0RD_0PBX+4*3DI,SP正确(3) MOVM)RDj)Pl,WORD_OP2非法,两个操作数不能都是变量(4) MOVAX,WORD_OP1DX非法,DX应改为BX,BP,SI或D或那么为存放器相对寻址。(5) MOVSAVEJtORD,DS非法,未指明数据段地址DS的偏移量(6) MOVSP,SS:DATA_WORDBXSI非法,SS与BX,SI不匹配,SS的偏移量用SP(7) MOVBXSI,2正确(8) MOVAX,WORD_OP1+WORD_OP2正确(9) MOVAX,WORD_OP1W0RD_0P2+100正确(10) MOVWORDj)P1,WORD_OP1W0RD_0P2非法4.假设VARl和VAR2为字变量,LAB为标号,试指出以下指令的错误之处:(I)ADDVARI,VAR2(2)SUBAL,VARl(3)JMPLABSI(4)JNZVARl(5)JMPNEARLAB答:(1)ADDVARI,VAR2ADD指令中,目的操作数必须是存放器或存储单元。(2) SUBAL,VARlAL为8位的,而VAR为字变量16位(3) JMPLABSI格式不对,LAB处应为一偏移量,而不是标号。(4) JNZVARlJNZ为非零转移,应转移到某个程序段,故后面应为一个标号。(5) JMPNEARLAB段内直接转移,格式应为JMPNEARPTRLAB5.画图说明以下语句所分配的存储空间及初始化的数据值。BYTE-VARDB'BYTE',12,-12H,3DUP(0,?,2DUP(1,2),?)WORD-VARDW5DUP(0,1,2),?,-5,BY,TE,256H解答:(1)BYTE-VAR(2)WORD-VAR42BYTE12-12H6 .试列出各种方法,使汇编程序把5150H存入一人存储器字中。解答:(1)DW5150H;(2)DB50H,51H;(3)DB'PQ'7 .请设置一个数据段DATASG,其中定义以下字符变量或数据变量。FLDIB为字符串变量:ipersonalcomputer,;FLD2B为十进制数字节变量:32;FLD3B为十六进制数字节变量:20;FLD4B为二进制数字节变量:OlOIIO01;FLD5B为数字的ASCII字符字节变量:32654;FLD6B为10个零的字节变量;FLD7B为零件名(ASeIl码)及其数量(十进制数)的表格:PART1 20PART2 50PART3 14FLDIw为十六进制数字变量:FFF0;FLD2W为二进制数字变量:OloIlO01;FLD3W为(7)中零件表的地址变量;FLD4W为包括5个十进制数的字变量:5,6,7,8,9;FLD5W为5个零的字变量;FLD6W为本段中字数据变量和字节数据变量之间的地址差。解答:DATASGSEGMENTFLDlBDBipersonalcomputer,FLD2BDB32D00590054014500OC02F4II000I:100200101200-02000-1-2FB1FF259-42045一541562021II2FLD3BDB14HFLD4BDB01011001BFLD5BDB32654FLD6BDBIODUP(0)FLD7BDB'PARTl',20D,'PART2',50D,'PART3',14DFLDlWDWOFFFOHFLD2WDW01011001BFLD3WDWFLD7BFLD4WDW5,6,7,8,9FLD5WDW5DUP(0)FLD6WDWfldiw-fldibDATASGENDS8 .假设程序中的数据定义如下:PARTNODW?PNAMEDB16DUP(?)COUNTDD?PLENTHEQU$-PARNIO问PLENTH的值为多少?它表示什么意义?解答:PLENTH代表着PARTNo至PLEMTH的地址差,也即三段数据的字节数PLENTH=22。9 .有符号定义语句如下:BUFFDB1,2,3,'123'EBUFFDB01.EQUEBUFF-BUFF问L的值为多少?解答:L=6.假设程序中的数据定义如下:1.NAMEDB30DUP(?)ADDRESSDB30DUP(?)CITYDB15DUP(?)CODE-LISTDB1,7,8,3,2(1)用一条MOVE指令将LNAME的偏移地址放入AXo(2)用一条指令将CODE-LIST的头两个字节的内容放入SIo(3)写一条伪操作使CODE-LENGTH的值等于CODE-LIST域的实际长度。解答:(1)MOVEAX,OFFSETLNAME;(2)MOVESI,0701H;(3)DE-LENGTHEQULENGTHCODE-LISTo10 .试写出一个完整的数据段DATA_SEG,它把整数5赋与一个字节,并把整数-1,0,2,5和4放在10字数组DATAJIST的头5个单元中。然后写出完整的代码段,其功能为:把DATA,IST中头5个数中的最大值和最小值分别存入MAX和MIN单元中。解答:DATA_SEGSEGMENT1.ENGTHDB5DATA_LISTDW-1,0,2,5t4,5DUP(?)MAXDW?MINDW?DATA_SEGENDSCODE_SEGSEGMENTASSUMECS:CODE_SEG,DS:DATA_SEGSTART:MOVAX,DATA_SEGMOVDS,AXMOVSI,OFFSETDATA_LISTMOVAX,SIMOVBX,SIMOVCX,LENGTHXORAX,AXXORBX,BXCLCAGAIN:CMPAX,SIJGNEXTlMOVAX,SINEXTkCMPBX,SIJNGNEXT2MOVBX,SINEXT2:JNZAGAINMOVNIAX,AXMOVMIN,BXCODEENDSENDSTART11 .给出等值语句如下:ALPHAEQU100BETAEQU25GAMMAEQU2以下表达式的值是多少?(1)ALPHA*1OO+BETA(2)ALPHAMODGAMMA+BETA(3) (ALPHA+2)*BETA-2(4) (BETA3)M0D5(5) (ALPHA+3)*(BETAMODGAMMA)(6)ALPHAGEGAMMA(7)BETAAND7(8)GAMMAOR3解答:(1)=10025;(2)=19;(3)=2548;(4)=3;(5)=103;(6)=0;(7)=01H;(8)=03H°13.对于下面的数据定义,三条指令分别汇编成什么?TABLEA DW10DUP(?)TABLEB DB10DUP(?)TABLECDB'1234'MOVEAX,LENGTHTABLEAMOVEBL,LENGTHTABLEBMOVECL,LENGTHTABLEC解答:MOVEAX,10MOVEBL,10MOVECL,114 .对于下面的数据定义,各条MoVE指令单独执行后,有关存放器的内容是什么?FLDBDBTABLEADW20DUP(?)TABLEBDB'ABCD'MOVEAX,TYPEFLDBMOVEAX,TYPETABLEAMOVECX,LENGTHTABLEAMOVEDX,SIZETABLEAMOVECX,LENGTHTABLEB解答:AX=OOOlHAX=0002HCX=OO14HDX=0028HCX=OOOIHo15 .指出以下伪操作表达方式的错误,并改正之。(1)DATA_SEGSEG(2)SEGMENT'CODE'(3)MYDATASEGMENT/DATAaIIENDS(4)MAIN_PROCPROCFARIIIENDMAIN_PROCMAIN_PROCENDP答:(1)DATA-SEGSEGMENT(2) CODESEGMENTPARA,CODE)(3) /DATA错。定义数据段应在代码段中用ASSUME。ENDS缺少'MYDATA'。(4)多余END,MAIN-PROC应删除。16 .按下面的要求写出程序的框架(1)数据段的位置从OEOOOH开始,数据段中定义一个100字节的数组,其类型属性既是字又是字节;(2)堆栈段从小段开始,段组名为STACK,(3)代码段中指定段存放器,指定主程序从100OH开始,给有关段存放器赋值;(4)程序结束。答:DATA-SEGSEGMENTORGOEOOOHBYTE-ARRAYLABLEBYTEWORD-ARRAYDW50DUP(?)DATA-SEGENDSSTACK-SEGSEGMENTPARA,STACK*STACK-SEGENDSCODE-SEGSEGMENTASSUMECS:CODE-SEG,DS:DATA-SEG,SS:STACK-SEGORG1000HSTART:MOVAX,DATA-SEGMOVDS,AXMOVAX,STACK-SEGMOVSS,AXCODE-SEGENDSENDSTART17 .假设在数据段X_SEG、附加段Y_SEG和堆栈段Z_SEG中分别定义了字变量X,Y和Z。试编制一完整的程序计算X<-X+Y+Z答:X-SEGSEGMENTXDW?X-SEGENDSZ-SEGSEGMENTZDW?Z-SEGEMDSY-SEGSEGMENTYDW?Y-SEGENDSCODESEGMENTMAINPROCFARASSUMEES:Y-SEG,CS:CODE,DS:X-SEG,SS:Z-SEGSTARTPUSHDSSUBAXAXPUSHAXMOVAX,Y_SEGMOVES,AXMOVAX,Z_SEGMOVSS,AXMOVAX,X_SEGMOVDS,AXMOVAX,DS:XMOVBX,ES:YADDAXBXJOOVERFLOWMOVBX,SS:ZADDAX,BXJOOVERFLOWMOVDS:X,AXOVERFLOW:RETMAINENDPCODEENDSENDSTART18 .写一个完整的程序放在代码段C_SEG中,要求把数据段D_SEG中的AUGEND和附加段E_SEG中的ADDEND相加,并把结果存放在D_SEG段中的SUM中。其中AUGEND.ADDEND和SUM均为双精度数,AUGEND赋值为99251,ADDEND赋值为-15962。解答:TlTLESUMD_SEGSEGMENTAUGWLABELWORDAUGENDDD99251SUMDW2DUPL(?)D_SEGENDSE_SEGSEGMENTADDWLABELWORDADDENDDD-15962E_SEGENDSC_SEGSEGMENTASSUMEDS:D_SEG,ES:E_SEG,CSiC-SEGMAINPROCFARSTART:PUSHDSNfOVEAX,0PUSHAXMOV MOV MOV MOVADDT :MOV MOV ADD ADC NfOV MOVRETAX,D_SEGDS,AXAX,E_SEGES,AXAX,AUGWBX,AUGW+2AX,ES:ADDWBX,ES:ADDW+2SUM,AXSUM+2,BXMAINENDPC_SEGENDSENDSTART19.读下面程序段,请问:在什么情况下,本段程序的执行结果是AH=0?BEGIN:INAL,5FHTESTAL,80HJZBRCHlMOVAH,0JMPSTOPBRCH1:MOVAH,OFFHSTOP:HLT解答:AL中的最高位为1时。20.读程序:START:INAL,20HMOVBL,ALINAL,30HMOVCL,ALMOVAX,0ADLOP:ADDAL,BLADCAH,0DECCLJNZADLOPHLT请问:(1)本程序实现什么功能?(2)结果在哪里?解答:完成20H*30H,结果在AX中。21 .请编一程序段完成AX*10的任务(要求不准用乘法指令做)。解答:MOVBX,AXMOVCL2SHLAX,CLADDAX,BXSHLAX,122 .编程序使:(I)AX存放器低4位清零。(2) BX存放器低4位置“1”。(3)CX存放器低4位变反。(4)用TEST指令测试DL存放器位3、位6是否同时为0,假设是,将0送DL;否那么1送DH。解答:1,ANDAX,OFFFOH2,ORBX,OOOFH3,XORCX,OOOFH4, TESTDL,48HJZLOOPMOVDH,1HLT1.OOP:MOVDL,0HLT23.编一程序段,完成符号函数(T28Wx127):1(x.>0)y=0(x=0)-1(x<0)假设X的值存放在DATAl中,y的值存放在DATA2中。解答:START:MOVAL,DATAlANDAL,ALJGEBIGRMOVAL,OFFHMOVDATA2.ALHLTBIGRiJEEQULMOVAL,1MOVDATA2,ALHLTEQUL:MOVDATA2,ALHLT.设AX存放器中有一个16位二进制数,编一程序,统计AX中“1”的个数,统计结果送CX中。解答:START:MOVCX,01.OOP:SUBAX,0JZSTPSALAX,1JNCNODINCCXNODiJMPLOOPSTPiHLT24 .编一子程序利用XLAT指令把十六进制数转换成ASCII码。假设ASCII码存放在以DATl为首地址的数据区中,对应的16进制数放在以DAT2为首地址的数据区中,转换结果送以DAT3为首地址的数据区中。解答:MAIN:PUSHBXPUSHSIPUSHDIPUSHCXPUSHALPUSHDSSTART:MOVBX,DATAlMOVSI,DATA2MOVDIDATA3MOVCX,16NEST:LODSBXLATDATAlSTOSB1.OOPNESTPOPDSPOPALPOPCXPOPDIPOPSIPOPBXRET26 .(略)27 .试分三种情况说明:当NUM字节单元中数据是什么情况时,TEMP字节单元分别是多少?NUMDBXXTEMPDB?MOVAL,NUMTESTAL,99HJNERESANDAL,99HJMPENDORES:JSNEINCALJMPENDONE:DECALENDO:MOVTEMP,AL答:NUM字节单元中的数据是一个八位2进制数。当其第1、4、5、8位均为0时,将此数装入temp单元,假设不满足此条件,那么又分为两种情况,其最高位为1时(负数),将此数减1装入temp单元;其最高位为0时(正数),将此数加1装入temp单元。28 .试编制一程序,把CHARl中各小写字母分别转换为对应的大写字母,并存放在CHAR2各字节单元中:CHARlDB'capitalize'CHAR2DBS-CHARlDUP(?)解答:MOVCX,OAHMOVSI,0MOVAX,IAH1.OOPl:ADDAX,CHARlSIMOVCHAR2SI,AXINCSI1.OOPLP129 .试编制一程序,把DA_BY1字节单元中数据分解成三个八进制数,其高位八进制数存放在DA-BY2字节单元中,最低位存放在DA_BY2+2字节单元中。DA_BY1DB6BHDA_BY2DB3DUP(O)解答:MOVAL,DA-BYHlSHRAL,2MOVDA-BY2,ALMOVAL,DA-BYlANDAL,07H;(0,111)MOVDA-BY2+2,AL30 .试编制一程序,找出DA数据区中带符号的最大数和最小数。解答:MOVCX,LENGTHMOVBX,0000HMOVDX,0000HMOVSI,0000HLOOPl:MOVAX,ADDRESSSICMPAX,80HJGEWlCMPAX,BXJGW2INCSILOOPLP1HLTWl:CMPAX,DXJGEW3JMPLOOPlW3:MOVDX,AXJMPLOOPlW2:MOVBX,AXJMPLOOPl31 .试编制一程序,统计出某数组中相邻两数间符号变化的次数。解答:MOVCX,LENGTHMOVSI,0MOVAX,ADDRESSSIANDAX,80HINCSIMOVBX,ADDRESSSIANDBX,80HSUBBX,AXNEGBXCMPBX,80HJGWl1.OOPLOOPlHLTWlINCDXJMPLOOPlHLT32 .设某数据段己有N个学生的某科成绩(百分制),并按学号的次序存放在以STUD为首址各字单元的低字节中。现在要求按成绩的上下记入名次,并把名次填入成绩所在字单元的高字节中,各字单元的信息格式为:1587O名次成绩成绩相同者,名次相同。试编制一程序实现上述要求(不要排序)。解答:START:MOVBX,OFFSETSTUD;BX,DX中放置成绩表的偏移地址;CX中放置的是要比拟的次数;名次放在Sl中MOVDX,OFFSETSTUDMOVCX,N-IMOVSI,0L00P1:MOVAL,DXL00P2:MOVBX,BX+2CMPAL,BX;取下一个同学的成绩JANEXT;如果比下一个同学成绩高那么到NEXT即使名次加一DECCX:否那么计数值减一JNEL00P2MOVDX+1,SIHLT:计数不为零再循环取下一个同学成绩NEXT:ADDSI,1DECCXJNEL00P2:名次加一MOVDX+1,SI;如果计数为零比拟完毕,最后将名次放到与成绩相连的单元中去MOVDX,DX+2;取下一个成绩去和其他N-I个数比拟LOOPLOOPlHLTENDSTART33.试编制程序,分别对NUM中各数统计出有多少个20,余下有多少个5,再余下有多少个2,再余下有多少个1。统计的各数分别存放在NuM20,NUM5,NUM2,NUMI的对应位置中,程序要求用主程序子程序形式编制,而且用两种参量传递方法分别编制主程序和子程序。数据段如下:DATASEGMENTNUMDW0133H,0D5FH,1234HCOUNTEQU($-NUM)/TYPENUMNUM20DBCOUNTDUP(0)NUM5DBCOUNTDUP(0)NUM2DBCOUNTDUP(0)NUMlDBCOUNTDUP(0)DATAENDS解答:DADASEGMENTNUMDW0133H,0D5FH,1234HCOUNTEQU($-NUM)/TYPENUMNUM20DBCOUNTDUP(0)NUM5DBCOUNTDUP(O)NUM2DBCOUNTDUP(O)NUMlDBCOUNTDUP(O)CMPNUMDB20,5,2,1DATAENDSCODESEGENTASSUMEDSiDATAASSUMECSiCODEMAINPROCFARSTART:MOVAX,DATAMOVDS,AXMOVDX,OFFSETNUM20MOVCX,COUNTMOVBX,OFFSETCMPNUMMOVSI,0MOVDI,OCALLCMPDATACMPDATAPROCNEARPUSHAXPUSHDXLOOP:MOVDX,DI1.OOPl:MOVAX,SICMPAX,DXJENEXTINESI1.OOPLOOPlJMPAGAINNEXT:ADDBXSI,1INCSI1.OOPLOOPlAGAIN:MOVCX,4ADDDI,COUNTLOOPLOOPHLTPUSHDXPUSHAXCMPDADTENDPMAINENDPCODEENDSENDSTART34.两个正整数BE1(114)和BE2(014),但是,BE1+BE2<15<,试编制一程序,把DAJVORD字单元的内容从第BEI位开始,自左至右的BE2个位清零,其余各位保持不变。处理的数据放在RESU单元中。解答:MOVBL,BElMOVCX,BE2MOVDX,01.OOP:MOVAX,1SALAX,BLADDDX,AXDECBXDECCXJNZLOOP;此循环的目的是保证DX中的16位数的DEl位到其后BE2个位全部为一NOTDX;将DX中的数取反,保证BEl位到BE2位个数全为零,其他为1MOVBX,OFFSETDA-WORDANDBX,DX35 .编写一条宏指令CLRB,完成用空格符将一字符区中的字符取代的工作。字符区首地址及其长度为变元。解答:CLRBMACROn,cblockMOVCX,n;长度为nMOVAL,S;把空格送到AL中LEADI,cblock;DI中放字符区首地址REPSTOSB;重复操作直到CX=OENDM36 .某工厂计算周工资的方法是每小时的工资率RATE乘以工作时间HOUR,另外每工作满十小时加奖金3元,工资总数存放在WAG中,请将月工资的计算编写成一条宏指令WAGES,并展开宏调用:WAGESRL42解答:宏定义:WAGESMACRORATE,HOURMOVAL,HOURMULRATEMOVBX,AXMOVAX,HOURDIV10MUL3ADDBX,AXMOVWAG,BXENDM宏调用:WAGESRL42宏展开:MOVAL,42MULRlMOVBX,AXMOVAX,42DIV10MUL3ADDBX,AXMOVWAG,BX37 .给定宏定义如下:DIFMACROAX,YMOVAX,XSUBAX,YENDMABSDIFMACROVI,V2,V31.OCALCONTPUSHAXDIFVI,V2CMPAX,OJGECONTNEGAXCONT:MOVV3,AXPOPAXENDM试展开以下调用,并判定调用是否有效。(I)ABSDIFPl,P2,DISTANCE(2)ABSDIFBX,SI,XD1,CX(3)ABSDIFBXSI,XBXSI,240H(4)ABSDIFAX,AX,AX解答:(1)宏展开:PUSHPlMOVPl,X+SUBPl,P2CMPPl,0JGE?0000NEGPl+?0000:MOVDISTANCE,Pl+POPPl调用有效(2)宏展开:+PUSHBX+MOVBX,X+SUBBX,SI+CMPBX,0+JGE?0000+NEGBX+?0000MOVXDI,BX+POPBX(3)宏展开:+PUSHBXSI+MOVBXSI,X+SUBBXSI,XBXSI+CMPBXSI,0+JGE?0000+NEGBXSI+?0000:MOV240HBXSIPOPBXSI(4)宏展开:+PUSHAX+MOVAX,X+SUBAX,AX+CMPAX,0+JGE?0000+NEGAX?0000:MOVAXAXPOPAX调用有效.试编制宏定义,要求把存储器中的一个用EOT字符结尾的字符串传送到另一个存储区去。解答:SENDMACROSCHARS,DCHARS1.OCALNEXT,EXITPUSHAXPUSHSIMOVSI,0NEXT:MOVAX,SCHARSSIMOVDCHARSSI,ALCMPAL,24HJZEXITINCSIJMPNEXTEXIT:ENDM38 .宏指令BIN_SUB完成多个字节数据连减的功能:RESULT-(A-B-C-D-)要相减的字节数据顺序存放在首地址为OPERAND的数据区中,减数的个数存放在COUNT单元中,最后结果存入RESULT单元。请编写此宏指令。解答:BIN-SUBMARCOOPERAND,COUNT,RESULTMOVAXOPERAND+1LOOP1:CMPCOUNT,0JNGEXITMOVBXOPERAND+2SUBAX,BXDECCOUNTINCOPERANDLOOPLOOPlEXIT:MOVRESULTAXENDM40.请用宏指令定义一个可显示字符串GOOD:'GOODSTUDENTS:CLASSXNAME,其中X和NAME在宏调用时给出。解答:MSGGENMACRO1.ABLAB,DBX,NAME'GOOD:'GOODSTUDENTS:CLASS&X&NAME''LOOPPRINTITPRINTIT:MOVDLLAB+1;将ASCII代码串放入DLMOVAH,2INT21HDECLABENDM缺4142 .定义宏指令并展开宏调用。宏指令JOE把一串信息'MESSAGENO.K,存入数据存储区XK中。宏调用为:I=OJOETEXT,IIIIJOETEXT,IJOETEXT,I解答:joemacroa,j;macroa,%j;J=j+1endmmarymacrox,k;x&kdbmessageno,&k;endmi=ojoetext,i+textdb,messageno.o,joetext,i+textldb,messageno.joetext,i+textdb'messageno.2,43 .大多数DOS功能调用都需要在AH存放器中存放不同的功能码。请将这种功能调用定义成宏指令D0S2U再定义宏指令DISP完成显示字符的功能,其中可使用已定义的DOS21。然后展开宏调用DISP'*'O解答:D0S21MACRONUMMOVAH,NUMINT21HEDMDISP'MACROZIFU,MOVDI,'ZIFU'D0S2102HENDM宏调用:DISP'*'宏展开:MOVDL,'*'MOVAH,02HINT21H44 .宏指令SToRE定义如下:STOREMACROX,NMOVX+I,II=I+1IFI-NSTOREX,NENDIFENDM试展开以下调用:1=0STORETAB,7解答:I=Ostoretab,7movtab,0I=Istoretab,7+movtab+l,11=2storetab,7+movtab+2,21=3storetab+3,3+movtab+3,3I=4storetab,7+movtab+4,41=5storetab,5+movtab+5,5I=6storetab,7+movtab+6,645 .试编写非递归的宏指令,使其完成的工作与44题的STORE相同。解答:storemacrokmovtab+k,kendmhongdiaoyongi=orept7store%ii=i+lendm46 .试编写一段程序完成以下功能,如给定名为X的字符串长度大于5时,以下指令将汇编10次。ADDAX,AX解答:reptmacrox,rmovax,operlifxgt5r=0rept10r=r+laddax,axendm47 .定义宏指令FINSUM:比拟两个数X和Y,假设X>Y那么执行SLN-X+2*Y;否那么执行SUM-2*X+Y解答:finsummacrox,y,sum;movbx,xmoval,2ifxgtymulyaddbx,axmovdx,summovdx,bxifxItymovbx,xmulxmovdx,summovdx,bxendmaaa48 .试编写一段程序完成以下功能:如变元X='VT55,那么汇编MOVTERMINAL,0;否那么汇编MOVTERMINAL,1。解答:premacrox,arg,terminalmovargifidnx,argmovterminal,0ifdifx,argmovterminal,1endm49 .对于DOS功能调用,所有的功能调用都需要在AH存放器中存放功能码,而其中有一些功能需要在DX中放一个值。试定义宏指令D0S21,要求只有在程序中定义了缓冲区时,汇编为:MOVAH,DOSFUNCMOVDX,OFFSETBUFFINT21H否那么,无MOVDX,OFFSETBUFF指令。并展开以下宏调用:D0S2101D0S21OAH,IPFIELD解答:D0S21MACRODOSFUNC,BUFFMOVAH,DOSFUNCIFB(BUFF)INT21HELSEMOVDX,OFFSETBUFF宏展开:D0S2101MOVAH,OHINT21HD0S21OAH,IPFIEIDMOVAH,OAHMOVDX,IPFIELDINT21H50 .编写一段程序,使汇编程序根据SIGN中的内容分别产生不同的指令。如果(SIGN)=0,那么用字节变量DIVD中的无符号数除以字节变量SCALE;如果(SIGN)=L那么用字节变量DIVD中的带符号数除以字节变量SCALE,结果都存放在字节变量RESULT中。解答:MOVAL,DIVDIFESIGNMOVAH,ODIVSCALEELSECBWIDIVSCALEENDIFMOVRESULT,AL