还剩20页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
汇编练习及答案
4.2习题
1.写出完成下列要求的变量定义语句1在变量varl中保存6个字变量4512H4512-1100/310H65530;2在变量var2中保存字符串‘BYTEwordWORD;3在缓冲区bufl中留出100个字节的存储空间;4在缓冲区buf2中,保存5个字节的55H再保存10个字节的240并将这一过程重复7次;5在变量var3中保存缓冲区bufl的长度;6在变量pointer中保存变量varl和缓冲区bufl的偏移地址
2.设变量varl的逻辑地址为0100:0000画出下列语句定义的变量的存储分配图varlDB12-1220/64DUP055Hvar2DBAssemblevar3DWAB cdEvar4DWvar2var5DDvar
23.指令正误判断,对正确指令写出源和目的操作数的寻址方式,对错误指令指出原因设VARIVAR2为字变量L1为标号1MOVSI1002MOVBXVAR1[SI]3MOVAX[BX]4MOVAL[DX]5MOVBRAL6MOVVARIVAR27MOVCSAX8MOVDS0100H9MOV[BX][SI]110MOVAXVAR1+VAR2ADDAXLENGTHVARI12ORBLTYPEVAR213SUB[DI]78H14MOVSVARIVAR215PUSH100H16POPCSLEADISTRINGMOVCX200CLDMOVAL20HREPZSCASBJNZFOUNDJMPNOT_FOUND问转移至I」FOUND的条件.设在数据段的变量OLDS和NEWS中保存有5个字节的字符串如果OLDS字符串不同于NEWS字符串则执行NEWLESS否则顺序执行程序.编程实现将STRING字符串中的小写字母变换成大写字母.设在数据段中定义了STUDENT_NAMEDB30DUPSTUDENT_ADDRDB9DUPSTUDENT_PRINTDB50DUP编写程序实现1用空格符清除缓冲区STUDENT.PRINT;2在STUDENT_ADDR中查找第一个‘二字符;3在STUDENT_ADDR中查找最后一个‘二字符;4如果STUDENT_NAME中全为空格符,则STUDENT_PRINT全存入,*;5WSTUDENT_NAME传送至I」STUDENT_PRINT的前30个字节中,将STUDENT_ADDR传送到STUDENT.PRINT的后9个字节中.在DS:X_BUF为起始地址的表中存有按由小到大顺序排列的一组16位无符号数其中该表的第
一、二两字节存放数据个数现在DS:X_KEY中存有一个关键字16位无符号数,要求从上述表中查找第一个此关键字,若找到此关键字,则DI中存放该关键字在该表中的偏移量;若无此关键字则将该关键字插入X_BUF表中,使该表依然有序,并将该关键字在表中的偏移量存放在DI中.分析下列子程序FUNC1并回答相应的问题FUNCIPROCNEARXORCXCXMOVDX01MOVCLXJCXZA20INCDXINCDXDECCXJCXZA20A10:MOVAX02SHLAXCLADDDXAXLOOPA10A20:MOVYDXRETFUNCIENDP若该子程序的入口参数为x0X10其输出参数为Y则1该子程序的功能是Y=fX二;2若X=0,则Y=;若X=3,则Y=;若X=5,则Y=.已知N3n100个8位无符号数已存放在缓存区inx中,其中第一个字节存放个数nbdsfid=324p=/n100个8位无符号数已存放在缓存区inx中,其中第一个字节存放个数n从第二个字节开始存放数据,下列的FUNC2子程序完成对这N个数据按由大到小排序,在划线处填入必要指令,使以下子程序完整FUNC2PROCNEARLEASIINXXORCXCXMOVCL[SI]DECCXBIO:INCSIMOVDISIPUSHSIMOVAL[SI]B20:INCSICMPAL[SI]MOVAL[SI]MOVDISIB30:LOOPB20POPCXPOPSIMOVAHJSI]MOV[SI]ALMOV[DI]AHLOOPBIOFUNC2ENDP.假设X和X+2单元的内容为双精度数PY和Y+2单元的内容为双精度数Q(PQ均为无符号数,其中XY为低位数),下列的子程序FUNC3完成使2PQ时,(AX)=1;2P〈二Q时,(AX)在划线处填入必要指令,使以下子程序完整FUNC3PROCNEARMOVDXX+2MOVAXXADDAXAXADCDXDXJCC10CMPDXY+2C20CIOCMPAXYC20CIO:MOVAXJC30C20:MOVAX-1C30:RETFUNC3ENDP.上机题编写程序实现,将缓冲区BUFFER中的100个字按递增排序,并按下列格式顺序显示数据1〈原序号〉数据2〈原序号〉.上机题按同余法产生一组随机数Nln=50,并按n+50赋给45名同学的5门bdsfid=372p=/n=50并按n+50赋给45名同学的5门课程的成绩,要求编程实现计算每个同学的平均成绩,并根据平均成绩统计全班的成绩各等级的人数A:90~100B:80~89C:70~79D:66~69E:60~65F:60分以下按下列格式显示Total〈总人数〉A:〈人数1B:〈人数2C:〈人数3D:〈人数4E:〈人数5F:〈人数
6.上机题编写程序实现下列5项功能通过从键盘输入1〜5进行菜单式选择1按数字键1完成将字符串中的小写字母变换成大写字母用户输入由英文大小写字母或数字〜9组成的字符串以回车结束,变换后按下列格式在屏幕上显示〈原字符串〉例如abcdgyt0092〈新字符串〉ABCDGYT0092按任一键重做;按Esc键返回主菜单2按数字键2完成在字符串中找最大值用户输入由英文大小写字母或数字0〜9组成的字符串以回车结束,找出最大值后按下列格式在屏幕上显示〈原字符串〉Themaximumis〈最大值》.按任一键重做;按Esc键返回主菜单3按数字键〃3完成输入数据组的排序用户输入一组十进制数值小于255然后变换成十六进制数,并按递增方式进行排序,按下列格式在屏幕上显示〈原数值串〉〈新数值串〉按任一键重做;按Esc键返回主菜单4按数字键〃4完成时间的显示首先提示用户对时,即改变系统的定时器HH:MM:SS以冒号间隔,回车结束,然后在屏幕的右上角实时显示出时间HH:MM:SS按任一键重新对时;按Esc键返回主菜单5按数字键5〃,结束程序的运行,返回操作系统[参考答案].W1varlDW4512H4512-1100/310H655302var2DBBYTEword7/WORD73buflDB100DUP4buf2DB7DUP5DUP55H10DUP2405var3DBLENGTHbufl6pointerDWvarlvar
23.答1MOVSI100;指令正确,源立即数寻址,目的寄存器寻址2MOVBXVAR1[SI];指令正确,源寄存器相对寻址,目的寄存器寻址3MOVAX[BX];指令正确,源寄存器间接寻址,目的寄存器寻址4MOVAL[DX];指令错误,DX不能用作为地址寄存器5MOVBRAL;指令错误,类型不一致6MOVVAR1VAR2;指令错误,MOV指令不能从存储器到存储器传送7MOVCSAX;指令错误,CS不能用作为目的操作数8MOVDS0100H;指令错误MOV指令不能将立即数传送到段寄存器9MOV[BX][SI]1;指令错误,类型不定10MOVAXVAR1+VAR2;指令错误,MOV指令中不能完成加法运算11ADDAXLENGTHVARI;指令正确,源:立即数寻址,目的寄存器寻址12ORBLTYPEVAR2;指令正确,源立即数寻址,目的寄存器寻址13SUB[DI]78H;指令错误类型不定14MOVSVARIVAR2;指令正确,源隐含寻址,目的:隐含寻址15PUSH100H;指令错误,立即数不能直接压入堆栈16POPCS;指令错误CS不能用作为目的操作数17XCHGAXES;指令错误,XCHG指令中不能使用段寄存18MOVDSCS;指令错误,MOV指令不能从段寄存器到段寄存器19JMPL1+5;指令正确,段内直接转移20DIVAX10;指令错误,DIV指令格式错误21SHLBL2;指令错误,移位指令的移位数要么是1要么是CL22MOVAL15+23;指令正确源立即数寻址,目的寄存器寻址23MULCX;指令正确,源寄存器寻址,目的隐含寻址24XCHGCL[SI];指令正确,源:寄存器间接寻址,目的:寄存器寻址25ADCCS:
[0100]AH;指令正确,源寄存器寻址目的直接寻址26SBBVAR1-5154;指令正确源立即数寻址目的直接寻址
5.答1JMPL1;段内直接寻址2JMPNEARL1;段内直接寻址3JNZL1;段内相对寻址4JMPBX;段内间接寻址5JGL1;段内相对寻址6JMPVAR1[SI];段内间接寻址7JMPFARPTRL1;段间直接寻址8JMPDVAR1;段间间接寻址
7.答DX寄存器中的内容为10FFH
9.答1ADDALN1-N2;指令错误,因为Nl-N2超出一个字节的范围2MOVAXN3+N4;指令正确3SUBBXN4-N3;指令正确4SUBAHN4-N3-N1;指令错误,因为N4-N3-N1超出一个字节的范围5ADDALN2;指令正确6MOVAHN2*N2;指令正确
11.解:1MOVAL40H2SHLAL13MOVAH16H4ADDALAH执行后AL=96H
13.解:1XORBXVAR;执行后BX=00F9H2ANDBXVAR;执行后BX=0002H3ORBXVAR;执行后BX=OOFBH4XORBX11110000B;执行后BX=003BH5ANDBX00001111B;执行后BX=00C4H6TESTBX1;执行后BX=OOCBH不变
15.答:1d2c3b
17.解设要传送的字符串有30个N=30STACKSEGMENTSTACKSTACKDW100HDUPTOPLABELWORDSTACKENDSDATASEGMENTASCIDBabcdefghijklmnopqrstuvwxyzl234ASC2DB30DUPDATAENDSCODESEGMENTASSUMECS:CODEDS:DATAES:DATASS:STACKSTART:MOVAXDATAMOVDSAXMOVESAXMOVAXSTACKMOVSSAXLEASRTOPMOVCXNLEASIASCIADDSICXLEADIASC2LI:DECSIMOVAL[SI]MOV[DI]ALINCDILOOPLIMOVAH4CH;返回DOSMOVAL0INT21HCODEENDS
19.解程序如下STACKSEGMENTSTACKSTACKDW100HDUPTOPLABELWORDSTACKENDSDATASEGMENTVARDW210017502410DATAENDSCODESEGMENTASSUMECS:CODEDS:DATAES:DATASS:STACKSTART:MOVAXDATAMOVDSAXMOVESAXMOVAXSTACKMOVSSAXLEASRTOPMOVAXVARCMPAXVAR+2JBELIXCHGAXVAR+2LI:CMPAXVAR+4JBEL2XCHGAXVAR+4L2:MOVVARAXMOVAXVAR+2CMPAXVAR+4JBEL3XCHGAXVAR+4MOVVAR+2AXL3:MOVAH4CH;返回DOSMOVAL0INT21HCODEENDSENDSTART如果VAR中保存的为有符号数则只需将上述程序中的3条JBE指令改成儿E指令
21.解:XORDXDXMOVCX8L1:SHLBL1RCLDX1SHLAL1RCLDX117XCHGAXES18MOVDSCS19JMPLl+520DIVAX1021SHLBL222MOVAL15+2323MULCX24XCHGCL[SI]25ADCCS:
[0100]AH26SBBVARI-
51544.说明下列指令对的区别1MOVAXVARI与MOVAXOFFSETVARI2MOVAXVAR2与LEAAXVAR23MOVALLENGTHVARI与MOVALSIZEVARI4MOVALES:[DI]CMPAL[SI]与CMPSB5SHRAL1与SARAL16SHRAL1与RORAL17ROLBX1与RCLBX
1.写出下列转移指令的寻址方式设L1为标号,VAR1为字型变量,DVAR1为双字型变量1JMPL12JMPNEARL13JNZL14JMPBX5JGL16JMPVAR1[SI]7JMPFARPTRLI8JMPDVAR
1.设DS=2000HBX=0100HSI=0002H20100=3412H20102=7856H21200=4C2AH21202=65B7H求下列指令执行后AX寄存器的内容1MOVAX1200H;2MOVAXBX;3MOVAX[1200H];4MOVAX[BX];5MOVAXz1100[BX];6MOVAX[BX][SI];7MOVAX1100[BX][SI].执行下列指令后,DX寄存器中的内容是多少?TABLEDW2536-1-161000013PYLDW7LOOPLI
23.解假设字变量VARI、VAR2和VAR3中至少有两个相等,程序段如下MOVAXVARICMPAXVAR2JNZLICMPAXVAR3JNZL2MOVAX-1LI:CMPAXVAR3JNZL3MOVAXVAR2LEASIVAR2JMPL4L3:LEASIVARIJMPL4L2:MOVAXVAR3LEASIVAR3L4:.答:BX=C02DH.提示在n个字节变量中存入1每次报数时相当于加上该变量的内容;当报数到m时该人出列,相当于使变量内容为0其编号为其相当偏移地址,因此最好采用寄存器相当寻址方式这样处理的好处是,继续报数时不必考虑已出列的人,只是他们对后续报数的影响是加0也就是说他已不起作用.提示显示部分应调用33题编写的显示子程序.解定义的宏指令如下TRANSSEGMACRODATAMOVAXDATAMOVDSAXMOVESAXENDM.解定义的宏指令如下INPUTSTRMACROBUFLEADXBUFMOVAHOAHINT21HENDM.解定义的宏指令如下DISPSTRMACROBUFLEADXBUFMOVAH09INT21HENDM.答:从缓冲区FIRST传送100个字节到SECOND缓冲区.答在STRING缓冲区中找到第一个非空格字符时转到FOUNDoMOVBXOFFSETTABLEADDBXPYLMOVDX[BX].如果堆栈的起始地址为2200:0000,栈底为0100HSP=00A8H求1栈顶地址;2SS的内容;3再存入数据5678H3AF2H后,SP的内容.设已用伪指令EQU定义了4个标识符N1EQU2100N2EQU10N3EQU20000N4EQU25000下列指令是否正确?并说明原因1ADDALN1-N2;2MOVAXN3+N4;3SUBBXN4-N3;4SUBAHN4-N3-N1;5ADDALN2;6MOVAHN2*N
2.按下列要求写出指令WAX寄存器的低4位清零,其余位不变;2将BX寄存器的低4位置1其余位不变;3将AL寄存器的低4位保持不变高4位取反;4测试BX中的位1和位2当这两位同时为0时将AL置OFFH否则AL清零;5测试BX中的位1和位2当这两位有一位为0时将AL置OFFH否则AL清零;6将AL中保存的字母ASCII码变换成相应的大写字母的ASCH码;7将AL中保存的字母ASCII码变换成相应的小写字母的ASCII码;8将AX中的各位取反;9将DX中的低7位取反,高9位不变;10将CX中的低8位与高8位互换.写出完成下述功能的程序段1传送40H至IJAL寄存器;2将AL的内容乘以2;3传送16H至l」AH寄存器;4AL的内容加上AH的内容计算最后结果AL二?
12.写出完成下述功能的程序段1从缓冲区BUF的0004偏移地址处传送一个字到AX寄存器;2WAX寄存器的内容右移2位;3将AX内容与BUF的0006偏移地址处的一个字相乘;4相乘结果存入BUF的0020H偏移地址处低位在前.设BX=110010116变量VAR的内容为OOUOOIOB求下列指令单独执行后BX的内容1XORBXVAR;2ANDBXVAR;3ORBXVAR;4XORBX11110000B;5ANDBX00001111B;6TESTBXlo.设DX=10111011BCL=3CF=1z求下列指令单独执行后DX的内容1SHRDX1;2SARDXCL;3SHLDXCL;4SHLDX1;5RORDXCL;6ROLDLCL;7SALDH1;8RCLDXCL;9RCRDL
1.选择题各小题只有一个正确答案1执行下列三条指令后MOVSP1000HPUSHAXCALLBXSP=1000H;SP=OFFEH;SP=1OO4H;SP=OFFCH;2要检查寄存器AL中的内容是否与AH相同,应使用的指令为.ANDALAH.ORALAH.XORALAH.SBBALAH3指令JMPNEARPTRLI与CALLLILI为标号的区别在于a.寻址方式不同;b.是否保存IP的内容;c.目的地址不同;d.对标志位的影响不同.寄存器DX:AX组成32位数,DX为高位编写程序段实现1DX:AX右移3位,并将移出的低3位保存在CL中;2DX:AX左移3位,并将移出的高3位保存在CL中;.已知在BUF的起始处保存有N个字符的ASCII码,编写汇编语言程序实现,将这组字符串传送到缓冲区BUFR中,并且使字符串的顺序与原来的顺序相反.利用移位、传送和相加指令实现AX的内容扩大10倍.在缓冲区VAR中连续存放着3个16位的无符号数,编写程序实现将其按递增关系排列;如果VAR中保存的为有符号数,则再编写程序实现将其按递减关系排列.编写程序段实现将BL中的每一位重复4次,构成32位的双字DX:AX例如当BL=01011101B时,得到的DX二OFOFHAX=0FF0FHo.编写程序段实现将AL和BL中的每一位依次交叉,得到的16位字保存在DX中,例如AL=01100101BBL=11011010B则得至U的DX=1011011010011001Bo.在变量VAR1和VAR2中分别保存有两个字节型的正整数,编写完整的汇编语言程序实现1当两数中有一个奇数时,将奇数存入VAR1,偶数存入VAR2;2当两数均为奇数时,两个变量的内容不变;3当两数均为偶数时,两数缩小一倍后存入原处.已知在字变量VARI、VAR2和VAR3中保存有3个相同的代码,但有一个错码,编写程序段找出这个错码,并将它送AX其地址送SI;如果3个代码都相同则在AX中置-1标志.分析下列程序段的功能:MOVCL04SHLDXCLMOVBLAHSHLAXCLSHRBLCLORDLBL.下列程序段执行后,求BX寄存器的内容MOVCL3MOVBX0B7HROLBX1RORBXCL.下列程序段执行后,求BX寄存器的内容MOVCL5MOVBX7D5CHSHRBXCL.设数组ARRAY的第1个字节存放数组的长度256从第2个字节开始存放无符号8位数求数组元素之和结果放在AX中如果计算的和超出16位数的范围,则给出溢出标志DX二-
1.设BUF中存放有N个无符号数或有符号数,编程实现求它们的最小值(存入AX)和最大值(存入DX).设BUFFER中存放有N个无符号(第1个字节存放缓冲区的长度),编程实现将其中的0元素抹去,并更新其长度.编写程序实现N个字乘以或除以1个字,设BUFN存放N个字,BUF1存放乘数或除数,PRODUCT存放乘积,QUOTIENT存放商,REMAINDER存放余数.编写一个子程序实现统计AL中1的个数,然后检测出字节型缓冲区BUF中和1个数相等的元素个数.设有n(设为17)个人围坐在圆桌周围,按顺时针给他们编号(12,…,n),从第1个人开始按顺时针方向加1报数,当报数到m(设为11)时,该人出列,余下的人继续进行,直到所有人出列为止编写程序模拟这一过程,求出出列人的编号顺序.编写子程序实现以十六进制数在屏幕上显示AL的内容.从键盘上读入一个正整数N(0N65535)转换成十六进制数存入AX并在屏幕上显示出来.在缓冲区BUFFER中第1个字节存放数组的长度
(256)从第2个字节开始存放字符的ASCII码,编写子程序完成在最高位给字符加上偶校验.编写程序完成求多位数(N个字)的绝对值.已知斐波那契数列的定义为)3(112121FFFFFi编写求该数列前n项的子程序.编写程序实现循环显示10条信息,保存每条信息的变量分别为INFOM1~INFORM
10.编写程序实现将包含20个数据的数组ARRAY分成两个数组正数数组ARRAYP和负数数组ARRAYN并分别将这两个数组中数据的个数显示出来.编写程序实现求缓冲区BUFFER100个字中的最小偶数(存入AX)O.编写程序实现求级数++++2222In的前n项和刚大于2000的项数no.已知数组A中包含有15个互不相等的整数,数组B中包含有20个互不相等的整数,编写程序实现将既在数组A中出现又在数组B中出现的整数存放于数组C中.定义一条宏指令,实现将指定数据段的段地址传送到段寄存器ES或DS的功能.定义一条宏指令,实现从键盘中输入一个字符串利用INT21H的09号功能.定义一条宏指令,实现在屏幕上显示出指定的字符串.定义一条宏指令,实现在屏幕上输出回车、换行.利用其它指令完成与下列指令一样的功能1REPMOVSB;2REPLODSB;3REPSTOSB;4REPSCASB
0.设在数据段中定义了STR1DBASSEMBLELANGUAGE7STR2DB20DUP利用字符串指令编写程序段实现1从左到右将STR1中的字符串传送到STR2;2从右到左将STR1中的字符串传送到STR2;3将STR1中的第6个和第7个字节装入DX;4扫描STR1字符串中有无空格,如有则将第一个空格符的地址传送到SI
0.设在数据段中定义了STRINGDBTodayisSundayJuly162000z编写程序实现将STRING中的‘用‘/代替.分析下列程序段完成的功能MOVCX100LEASIFIRSTLEADISECONDREPMOVSB.分析下列程序段。