习题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开始的15个存储单元。5)MOVAX,0HMOVDS,AXMOVES,AXMOVAL,05HMOVDI,0A000HMOVCX,0FHCLDAGAIN:SCASBLOOPNEAGAINHLT本程序实现了什么功能?【答】从地址0A000H开始的15个单元中查找字节型数据05H,用条件循环LOOPNZ,控制数据05H的查找。4.2阅读程序:1).CLDLEADI,[0100H]MOVCX,0080HXORAX,AXREPSTOSW本程序实现了什么功能?【答】将DS中起始地址为0100H的128个字节单元清零。2).MOVAL,08HSALAL,01H;(AL)=00010000HMOVBL,ALMOVCL,02HSALAL,CL;(AL)=01000000HADDAL,BL;(AL)=01010000H本程序实现了什么功能?【答】将AL中的内容乘以10。4.3试分析下列程序完成什么功能?MOVDX,3F08HMOVAH,0A2HMOVCL,4SHLDX,CL;(DX)=F080HMOVBL,AHSHLBL,CL;(BL)=20HSHRBL,CL;(BL)=02HORDL,BL;(DL)=82H【答】将DX中的低4位数据8H分离出来,将AH中的低4位数据2H分离出来,合并为82H存放在DL。4.4已知程序段如下:MOVAX,1234HMOVCL,4ROLAX,CLDECAXMOVCX,4MULCX试问:(1)每条指令执行后,AX寄存器的内容是什么?(2)每条指令执行后,CF,SF及ZF的值分别是什么?(3)程序运行结束时,AX及DX寄存器的值为多少?【答】MOVAX,1234H;(AX)=1234H,CF=SF=ZF=0MOVCL,4ROLAX,CL;(AX)=2341H,CF=1,SF=ZF=0DECAX;(AX)=2340H,CF=1,SF=ZF=0MOVCX,4;MULCX;(AX)=8000H,CF=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;2字节Var1Var2Var3Var410??FFH2?U00H?O00H?Y00H?01H?E00H?R00H?A00H?00H?W00H0O00H0H00H$4.8编写一段程序,比较两个5字节的字符串OLDS和NEWS,若相同,在RESULT置0,否则置0FFH。【答】参考程序:DATASEGMENTOLDSDB1,2,3,4,5NEWSDB1,2,3,4,'A'N=$-NEWSRESULTDB0DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;初始化MOVSI,OFFSETOLDSMOVDI,OFFSETNEWSMOVCX,NDON:MOVAL,[SI]CMPAL,[DI]JNZNOEQU;串不相等转INCSIINCDILOOPDONMOVAL,0JMPOUTPUTNOEQU:MOVAL,0FFHOUTPUT:MOVRESULT,ALSTOP:JMPSTOP;程序陷阱CODEENDSENDSTART4.9编程求和Y=A1+A2+….+A100。其中Ai为字节变量。【答】参考程序:DATASEGMENTTABLEDW1111H,2222H,3333H,2222HCOUNTEQU$-TABLEYALDW?YAHDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMIANPROCFARPUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXMOVDX,0XORAX,AX;清AXMOVBX,OFFSETTABLEMOVCX,4LP:ADDAX,[BX];求和ADCDX,0INCBXINCBX;指向下一个数LOOPLP;未加完,继续MOVYAL,AX;存和MOVYAH,DXMAINENDPCODEENDSENDSTART4.10内存中以FIRST和SECOND开始的单元中分别存放着两个16位组合的十进制(BCD码)数,低位在前。编程序求这两个数的组合的十进制和,并存到以THIRD开始的单元。【答】参考程序:1325+9839=?DATASEGMENTFIRSTDB05H,02H,03H,01H;SECONDDB09H,03H,08H,09H;THIRDDB20DUP(?)DATAENDSSTACKSEGMENTST1DB100DUP(‘SA’)TOP1EQU$-ST1STACKENDSCODESEGMENTASUMMECS: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中。【答】参考程序DATASEGMENTBUFDB'DFASFAAAFDFAAFFFA'COUNTEQU$-BUFDATAENDSSTACKSEGMENTBUFFDW100DUP(?)MEQU$-STASTACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVAX,MMOVSP,AXMOVCX,COUNTMOVDX,0LEASI,BUFMOVAL,'A'CALLFindCharMOVAH,4CHINT21H;返回DOSFindCharPROCNEARPUSHDXNEXT:CMP[SI],ALJNZOTHERINCDXOTHER:INCSILOOPNEXTPOPDXRETFindCharENDPCODEENDSENDBEGIN4.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:DECCXJNZGOON解法二:用比较指令CMP、转移指令JA/JNA/JB/JNB、循环指令LOOP等BLOCKDB-1,-3,5,6,-2,0,20,10NEQU$-BLOCKPLUS_DDB8DUP(?);正数缓冲区PLUSDB0MINUS_DDB8DUP(?);负数缓冲区MINUSDB0……MOVSI,OFFSETBLOCKMOVDI,OFFSETPLUS_DMOVBX,OFFSETMINUS_DMOVCX,N;数据个数送CXGOON:MOVAL,[SI]TESTAL,80HJNZJMIUS;为负数,转INCPLUS;正数个数加一MOV[DI],AL;传正数INCDIJMPAGAINJMIUS:INCMINUS;负数个数加一MOV[BX],ALINCBXAGAIN:INCSIDECCXJNZGOON4.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码。)【答】参考程序:DATASEGMENTADRDB5DUP(?)DATAENDSCODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATASTART:MOVAX,7EC3H;假设ax中存放7ec3hLEASI,ADRMOVDL,4AGAIN:MOVBX,AXANDBX,000FHADDBL,30HCMPBL,'9'JGADUSTJMPSTOREADUST:ADDBL,07HSTORE:MOV[SI],BLIN

1 / 12
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功