您好,欢迎访问三七文档
习题4汇编语言程序设计主要内容:汇编语言程序设计。主要介绍汇编语言程序的设计方法与编程原理,重点掌握算术运算程序、字符串处理程序、码制转换程序、子程序设计程序、常用DOS和BIOS功能调用程序、汇编语言常用伪指令。4.1分析执行下列指令序列后的结果:1)MOVAX,1234HMOVBX,00FFHANDAX,BX【答】(AX)=0034H2)MOVAL,01010101BANDAL,00011111B;(AL)=00010101BORAL,11000000B;(AL)=11010101BXORAL,00001111B;(AL)=11011010BNOTAL【答】(AL)=00100101B3)MOVDL,05HMOVAX,0A00HMOVDS,AXMOVSI,0HMOVCX,0FHAGAIN:INCSICMP[SI],DLLOOPNEAGAINHLT本程序实现了什么功能?【答】在以0A001H开始的15个单元中查找05H。4)MOVAX,DSEGADDRMOVDS,AXMOVES,AXMOVSI,OFFSETB1ADDRMOVDI,OFFSETB2ADDRMOVCX,NCLDREPMOVSBHLT本程序实现了什么功能?【答】将B1ADDR中N个字节数据传送到B2ADDR。5)MOVAX,0HMOVDS,AXMOVES,AXMOVAL,05HMOVDI,0A000HMOVCX,0FHCLDAGAIN:SCASBLOOPNEAGAINHLT本程序实现了什么功能?【答】用重复前缀代替LOOPNZ,选择重复前缀。从地址0A000H开始的15个单元中查找字节型数据05h,选择重复前缀repnz4.2阅读程序:1).CLDLEADI,[0100H]MOVCX,0080HXORAX,AXREPSTOSW本程序实现了什么功能?【答】将CS中起始地址为0100h的256个字节单元清零。2).MOVAL,08HSALAL,01H;(AL)=00010000HMOVBL,ALMOVCL,02HSALAL,CL;(AL)=01000000HADDAL,BL;(AL)=01010000H本程序实现了什么功能?【答】(AL*2+AL*8)。4.3试分析下列程序完成什么功能?MOVDX,3F08HMOVAH,0A2HMOVCL,4SHLDX,CL;(DX)=F080HMOVBL,AHSHLBL,CL;(BL)=20HSHRBL,CL;(BL)=02HORDL,BL;(DL)=82H【答】将3f08h的’8’存放在dl的高四位,0a2h的’2’存放在dl的低四位。4.4已知程序段如下:MOVAX,1234HMOVCL,4ROLAX,CLDECAXMOVCX,4MULCX试问:(1)每条指令执行后,AX寄存器的内容是什么?(2)每条指令执行后,CF,SF及ZF的值分别是什么?(3)程序运行结束时,AX及DX寄存器的值为多少?【答】MOVAX,1234H;(AX)=1234HCF=SF=ZF=0MOVCL,4ROLAX,CL;(AX)=2341HCF=1,SF=ZF=0DECAX;(AX)=2340HCF=1,SF=ZF=0MOVCX,4;MULCX;(AX)=8000HCF=ZF=0,SF=1,DX=04.5试分析下列程序段:ADDAX,BXJNCL2SUBAX,BXJNCL3JMPSHORTL5如果AX、BX的内容给定如下:AXBX(1)14C6H80DCH(程序转向L2)(2)B568H54B7H(程序转向SHORTL5)问该程序在上述情况下执行后,程序转向何处?【答】(1)程序转向L2。(2)程序转向SHORTL5。4.6以下为某个数据段,试问各个变量分别占多少字节,该数据段共占多少字节?DATASEGMENTVAR1DW9;2字节VAR2DD10DUP(?),2;44字节VAR3DB2DUP(?,10DUP(?));22字节VAR4DB‘HOWAREYOU';11字节DATAENDS【答】该数据段共占79字节。4.7下列语句在存储器中分别为变量分配多少字节空间?并画出存储空间的分配图。VAR1DB10,2;2字节VAR2DW5DUP(?),0;12字节VAR3DB‘HOWAREYOU?',‘$';13字节VAR4DD-1,1,0;12字节Var1Var2Var3Var410??FFH2?U00H?O00H?Y00H?01H?E00H?R00H?A00H?00H?W00H0O00H0H00H$4.8编写一段程序,比较两个5字节的字符串OLDS和NEWS,若相同,在RESULT置0,否则置0FFH。【答】参考程序:OLDSDB1,2,3,4,5NEWSDB1,2,3,4,5RESULTDB?MOVSI,OFFSETOLDSMOVDI,OFFSETNEWSMOVCX,10CLDREPCMPSBJNZNOEQU;串不相等转MOVAL,0JMPOUTPTNOEQU:MOVAL,0FFHOUTPT:MOVRESULT,ALSTOP:JMPSTOP4.9编程求和Y=A1+A2+….+A100。其中Ai为字节变量。【答】参考程序:DATASEGMENTTABLEDW12,3,45,..YALDW?YAHDW?DATAENDS……….MIANPROCFARPUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXMOVDX,0XORAX,AX;清AXMOVBX,OFFSETTABLEMOVCX,4CLCLP:ADDAX,[BX];求和JNCDONINCDXCLCDON:INCBXINCBX;指向下一个数LOOPLP;未加完,继续MOVYAL,AX;存和MOVYAH,DXMAINENDPCODEENDSENDSTART4.10内存中以FIRST和SECOND开始的单元中存放着4字节非组合BCD码,低位在前。编程序求这两个数的非组合的十进制和,并存到以THIRD开始的单元。【答】参考程序:1325+9839=?DATASEGMENTFIRSTDB05H,02H,03H,01H;SECONDDB09H,03H,08H,09H;THIRDDB20DUP(?)DATAENDSSTACKSEGMENTST1DB100DUP(‘SA’)TOP1EQUST1LENGTHST1STACKENDSCODESEGMENTASUMMECS:CODE,DS:DATA,SS:STACKMAINPROCFARSTART:MOVAX,DAT;初始化数据段MOVDS,AXMOVAX,STACK;初始化堆栈段MOVSS,AXMOVAX,TOP1MOVSP,AXMOVCX,4;计算4次MOVBX,OFFSETDAT1;取数据地址MOVSI,OFFSETDAT2;取数据地址MOVDI,OFFSETSUM;取结果地址MOVAH,00H;将暂存标志的AH清0DON1:MOVAL,[BX];取第一个数SAHF;将AH中的标志送标志寄存器ADCAL,[DI];与第二个数带进位加AAA;十进制校正LAHF;将标志寄存器内容送AHORAL,30H;计算值拼成ASCII码MOV[DI],AL;存结果的ASCII码INCBX;指向第一个数的下一位INCSI;指向第二个数的下一位INCDI;指向结果单元的下一位LOOPDON1;未计算完,继续ANDAH,01H;将最高位的进位标志送AHORAH,30H;最高位的进位位拼成ASCII码MOV[DI],AH;存结果的最高位MOVAH,02H;调用DOS的02H功能显示MOVCX,05H;显示数据的位数DON2:MOVDL,[DI];显示数据送DLINT21H;显示DECDI;显示数据所在存储单元加一LOOPDON2;未显示完,继续MOVAH,4CH;返回DOSINT21HRETMAINENDPCODEENDSENDSTART4.11试编程序,统计由40000H开始的16K个单元中所存放的字符“A“的个数,并将结果存放在DX中。【答】参考程序DATASEGMENTDATA1DB'DFASFAAAFDFAAFFFA'COUNTEQU$-DATA1DATAENDSSTACKSEGMENTSTADB100DUP(?)TOPEQULENGTHSTASTACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVAX,TOPMOVSP,AXMOVCX,COUNTMOVDX,0LEASI,DATA1MOVBL,'A'NEXT:CMP[SI],BLJNZOTHERINCDXOTHER:INCSILOOPNEXTCODEENDSENDBEGIN4.12统计数据块中正数与负数的个数,并将正数与负数分别送到两个缓冲区。【答】参考程序:BLOCKDB-1,-3,5,6,-2,0,20,10PLUS_DDB8DUP(?);正数缓冲区MINUS_DDB8DUP(?);负数缓冲区PLUSDB0MINUSDB0MOVSI,OFFSETBLOCKMOVDI,OFFSETPLUS_DMOVBX,OFFSETMINUS_DMOVCX,8;数据个数送CXGOON:LODSB;AL←[SI]TESTAX,80HJNZJMIUS;为负数,转INCPLUS;正数个数加一STOSB;[DI]←AL,传正数JMPAGAINJMIUS:INCMINUS;负数个数加一XCHGBX,DISTOSB;送负数到缓冲区XCHGBX,DIAGAIN:DECCXJNZGOON4.13编写一个子程序将AX中的十六进制数,转换成ASCII码,存于ADR开始的四个单元中。提示:1)、AX中的数从左到右,转换成ASCII码,用循环左移ROL和AND指令,把提出的一个十六进制数置BL中;2)、0~9的ASCII码:30~39H,A~F的ASCII码:41H~46H。(先把每个数加30H,判断是否为数字0~9?若是A~F,再加07H,得字母的ASCII码。)【答】参考程序:DATASEGMENTADRDB4DUP(?)DATAENDSCODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATASTART:MOVAX,7EC3H;假设ax中存放7ec3hLEASI,ADRMOVDL,4AGAIN:MOVBX,AXANDBX,000FHADDBL,30HCMPBL,'9'JGADUSTJMPSTOREADUST:ADDBL,07HSTORE:MOV[SI],BLINCSIMOVCL,4ROLAX,CLDECDLJNZAGAINMAINENDPCODEENDSENDSTART4.14编写一个子程序将AX中的2进制数,转换成10进制ASCII码,存于ADR开始的五个单元中。【答】参考程序:BINEQU5555H;假设二进制数为5555HDATASEGMENTADRDB4DUP(?)DATAENDSSTACKSEGMENTSTADB100DUP(?)TOPEQULENGTHSTASTACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVAX,TOPMOVSP,AXMOVAX,BINLEABX,ADRMOVCX,10000DCALLBINTODECMOVCX,1000DCALLBINTODECMOVCX,100DCALLBINTODECMOVCX,10DCALLBINTODECMOVCX,01DCALLBINTODECMOVAX,04CH;返回DOSINT21HMAINENDP;十进制转二进制,完成一位运算,十进制存于ax中,结果存于bx所指向的地址中BINTODECPROCNEARMOVDX,0DIVCXADDAL,30HMOV[BX],ALMOVAX,DXINCBXRETBINTODECENDPCODEENDSENDSTART4.15编写一个子程序,
本文标题:习题4
链接地址:https://www.777doc.com/doc-3367325 .html