1、第四章汇编语言程序设计4-1汇编语言程序设计的几个步骤是:解:编写汇编语言程序的过程根本上与编写高级语言程序的过程是相同的。(1)从实际问题抽象出数学模型;(2)确定解决该数学模型的方法,选择最正确算法;(3)画出流程图,根据算法把解决问题的思路和方法用图形表示出来;(4)分配内存工作单元和存放器;(5)根据流程图编制程序;(6)上机调试,检测和排错。4-2计算以下表达式的值(A1=5OH,B1=20,Gl=2)。(1) A1*JOO+B1(2)AlMODG1+B1(3)(Al+2)*Bl-24)B1/3MOD5(2) (5)(AI+3)*(BlMODGl)(6)AlGTGl(7)BlAND7
2、8)BlSHL2+G1SHR1解:(1)502020(3)1038(4)1(5)0(6)OFFFFH(7)04H(8)51H4-3数据段定义如下,设该段从03000H开始。DSEGSEGMENTARRAYlDB2DUP(0,I,?)ARRAY2DW100DUP(?)FHZEQU20HARRAY3DB10DUP(0,1,4DUP(2),5)DSEGENDS试用分析运算符OFFSET、SEGLENGTH.TYPE、SIZE求出ARRY1、ARRY2.ARRY3的段、偏移量和类型,以及它们的LENGTHSIZE解:变量名OFFSETSEGTYPELENGTHSIZEARRYl00300H122(2
3、1)ARRY206H0300H2100200(1002)ARRY3206=0CEH0300H1IO10(10l)4-4(略)4-5以下语句汇编后,变量CON1,CoN2和CoN3的内容分别是多少?Nl=IOCONl00CON2FF00CON3FFN2=5N3=3CONlDB(NIANDN2ORN3)GEOFHC0N2DW(N2ANDN1XORN3)LEOFHC0N3DB(NIMODN3)LT(N2SHR1)解:如下图4-6设有一个已定义的数据段如下:DATASEGMENTVARlDB99VAR2DB99,ADRDWVARI,VAR2DATAENDS假设要使ADR+2的字单元中存放内容为“002
4、2H”,上述空白处应填入什么语句?解:ORG0020H4-7下述程序段执行后,存放器CX,Sl的内容是多少?ARRYDW20DUP(5)XORAX,AXMOVCX,LENGTHARRYMOVSI,SIZEARRY-TYPE解:(CX)=14H(SI)=26H4-8试定义一个结构,它应包括一个学生的以下信息:姓名、学号、及3门课程的成绩。然后给出3条机构预置语句,将3个学生的情况送入3个结构变量中。解:STUDSTRUC;定义一个结构,结构名为STUDNAMElDB;姓名字段NUMDB?;学号字段SCORDB3DUP(?);三门课程成绩字段STUDENDSDATASEGMENT;在数据段中通过三
5、个结构变量引用,并赋值STUDlSTUD;结构变量名STUDlSTUD2STUD;结构变量名STUD2STUD3STUD;结构变量名STUD3DATAENDS4-9试定义一条宏指令,它可以实现任一数据块的传送假设无地址重叠),其源地址、目的地址和块长度作为参数处理。解:根据要求,子程序的入口参数有:源数据区和目的数据区的首址以及数据块的大小(包含的字节数)。假设参数传递采用固定内存单元传递方式。SADR源数据区首地址;DADR目的数据区首地址;SLENG一一数据块长度。程序如下:SMOVEMACROSADR,DADR,SLENGASSUMECS;CODELDSSLSADRLESDLDADRMO
6、VCX,SLENGCLDCMPSI,DIJAMOVESTDADDSLCXDECSIADDDI,CXDECDIMOVE:MOVSBLOOPMOVERETENDM4-10设VARl和VAR2为字变量,LAB为标号,试判断以下指令的正误,并改正:(I)ADDVARlVA2(2)JNZVARl(3)SUBAL,VARl(4)JMPNEARLAB(5)JMPLABSI(6)MOVAL,VAR2解:(1)错,ADD的两个操作数不能同时为存储单元。改:MOVAX,VARlADDAX,VAR2错,JCC后面应该是标号,不应该是变量改:JNZLAB错,两个操作数不匹配改:SUBAX,VARl(4)错,缺少PTR
7、运算符改:JMPNEARPTRLAB(5)错,LAB与SI不能相加改:JMPFARPTRLAB或者JMPWORDPTRSI(6)错,操作数类型不匹配改:MOVAX,VAR24-11数据定义如下,问LI和L298等于多少?BlDB1,2,3,123B2DBO1.lEQU$Bl1.2EQUB2Bl解:Ll=$B1=70=7,L2=B2-Bl=6-0=64-12对于以下数据定义,指出以下指令的错误。AlDB?A2DB10KlEQU1024(I)MOVKl,AX(2) MOVAl,AX(3) MOVBX,AlMOVBX,1000(4) CMPAl,A2(5) KlEQU2048解:(I)KI为名称,表
8、示一立即数,不能做为目的操作数。(2)Al为字节型,类型不匹配(3)类型不匹配(4)源和目的操作数不能同为存储器操作数(5)对己经被EQU定义的Kl,在本程序段不能二次定义4-13试编程计算Z=5X+3Y+10.X,丫均放在数据段,其值由编程者自定。结果Z仍放在数据段。解:DATASEGMENTXDB10YDB5ZDW?DATAENDSSTACKSEGMENTPARASTACKSTACKSTACKCODEDW20HDUP(0)ENDSSEGMENTASSUMECS:CODE,DS:DATA,SS:STACKMAINPROCFARPUSHDSMOVAX,0PUSHAXSTART:MOVAX,DA
9、TAMOVDS,AXMOVAL,XMOVBL,YMULBL;X*5MOVDX,AX;转存至DXMOVAL,YMOVBL,3MULBL;Y*3,积在AX中ADDAL,OAHADDAX,DXMOVZ,AX;结果仍放数据段RETMAINENDPCODEENDSENDSTART4-14(略)4-15用查表法将存放于数据段中一个有序的十六进制数串(范围:OFH)翻译成ASSil码表仍放于数据段中.解:DATASEGMENTTABDB30H,31H,32H,36H,37HDB38H,39H,41H,45H,46HHEXDB6ASCDB?DATAENDSSTACKlSEGMENTPARAtATACK,DW2
10、OHDUP(O)STACKlENDSCODESEGMENTASSUMECSiCODE,DSiDATA,SS:STACKlBEGIN:MOVAX,DATAMOVDS,AXMOVBX,OFFSETTAB;设置ASCll码表的基地址在BX中XORAX,AXMOVAL,HEX;要查找的一位十六进制数在AL中ADDBX,AX;基址+偏移置即可计算出该十六进制数ASCII码存放地址MOVAUBX;该地址单元的内容即为要查找的ASCn码MOVASC,AL;存放ASCn码至ASC字节单元MOVAH,4CHINT21HCODEENDSENDBEGIN4-16试编写一程序,把X和Y中的大者存入BIG单元。假设X=
11、Y,那么把其中之一存入BIG单元。解:DATASEGMENTXDW1028YDW1446BIGDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,XMOVBX,YCMPAX,BXJGESTORE;取字数据X至AX;取字数据Y至BX;比拟(AX)和;假设(AX);假设(AX)1HLOOPDISPMAINENDPCODEENDSENDSTART4-21在数据段中存放有一字符串80个字符),以回车符CR结束。编写一程序统计此字符串的长度,并将它存入数据区LENTH单元,也显示在屏幕上。解:DATASEGME
12、NTSTR1DB4PIeaseinputthecharofASCIIandtheCRtoendthestring,ODHLENGTHDW?DATAENDSSTACKSEGMENTPARASTACK,STACK,DW20HDUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATASTAR1T:MOVAX,DATA;设置STR1的地址指针为BX;用DL统计字符个数MOVDS,AXLEABX,STR1MOVDL,0NEXT1:MOVAL,BX;取字符INCBXCMPAL1ODHJZEXIT;为零,那么是回车符,转EXlTCMPAL,30HJGENEXT;非零,那么
13、不是回车符,顺序执行INCDL;假设非数字,DL记下一个字符JMPNEXT1NEXT:CMPAL,39HJBENEXT1;假设(AL)为数字09,不统计,转NEXTIINCDL;假设(AL)39H,非数字09.DL记下一个字符,然后转NEXTlJMPNEXT1EXIT:MOVLENGTH,DLL0P1LEABX,LENGTHMOVCH,02H:MOVCL,04ROLDL,CLANDDL,OFHADDDL,30H;将(DL)转换成它的ASCII码CMPDL,3AHJBSTOREADDDL,07HSTORE:MOVBX,DL;存结果至LENGTH字单元INCBXDECCHJNZLOP11.EADX
14、LENGTHMOVAH,09H;显示LENGTH字单元的内容INT21HMOVAH,4CHINT21HCODEENDSENDSTART4-22试用串操作指令将数据区一个数组BLOCK(均为字节数)中的奇数和偶数分开存放,统计奇、偶数的个数,并将奇数送DATA2首址区,偶数送DATA3首址区。解:DATASEGMENTDATA1DBOOH,01H,09H,QAM,DATA2-1DBODATA2DB64HDUP(?)DATA3-1DBODATA3DB64HDUP(?)DATAENDSSTACKSEGMENTPARASTACKtSTACK,DWIOHDUP(?)STACKENDSCODESEGME
15、NTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXLEABX,DATAlLEASI,DATA2LEADI,DATA3MOVCX,64HXORDX,DXLOP:MOVAL,BXTESTAL,01HJZNEXTlMOVSI,ALINCSIINCDHJMPXEXT2NEXT1:MOVDI,ALINCDIINCDLNEXT2:INCBX1.OOPLOPMOVDATA2-1,DHMOVDAlA3-1,CMOVAH,4CHINT21HCODEENDSENDSTART4-23编一个程序,其功能是将一个字节数组ARRAY中的正数和负数分开存放于以P
16、LUS和MINUS开始的单元中,并在屏幕上显示正数和负数的个数。设该数组长度放在数组的第一个字节单元中。解:DATASEGMENTARRAYDW-1,5,-3,8,18,-4,-2,48COUNTDBS-ARRAYPLUSDBCountdup(?)MINUSDBCOUNTDUP(?)DATACODEMAINENDSSEGMENTPROCFARASSUMECS:CODE,DS:DATA,ES:DATASTART:PUSHDSINIT:MOVAX,0PUSHAXMOVAX,DATAMOVDS,AXMOVES,AXMOVSI,OFFSETARRAY+1MOVDI,OFFSETPLUS+1MOVBX,
17、OFFSETMINUS+1MOVCX,COUNTGOON:LODSBPLS:TESTAL,80HJNZMISINCBYTEPTRPLUSSTOSBMIS:JMPAGAININCBYTEPTRMINUSXCHGBX,DISTOSBXCHGBX,DIAGAIN:DECCXJNZGOONORBYTEPTRPLUS,30HMOVDL,BYTRPTRPLUSMOVAH,02HINT21HORBYTEPTRMINUSMOVAH,02HINT21HRETMAINCODEENDPENDSENDSTART4-24现有一组无序的字:25,46,3,75,-5,30,要求对它们进行排序,其算法框图如教材图4-31所
18、示,试编写完成此功能的程序。解:设该组无序的字采取从小到大排序。STACKSEGMENTPARASTACKDW100DUP(?)STACKENDSDATASEGMENTSTRDW25,46,3,75,-5,30NEQUS-STRDATACODEENDSSEGMENTASSUMECS;CODE,DS:DATA,SS:STACKMAINPROCFARPUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVBX,N-INEXT2:MOVCX,BXSHRCX,1MOVDI,CXMOVBX,OFFSETSTRNEXT1:MOVAX,BXCMPAX,BX+2MOVBX,AXNEX
19、T:INCBXINCBXLOOPNEXTlDECDIJNZNEXT2RETMAINCODEENDPENDSENDMAIN4-25编写一程序,求级数M+22+32+的前n项和刚大于1000的项数n。解:采用双重循环CODESEGMENTASSUMECS:CODESTART:MOVBX,0MOVDX,0LOPl:INCBXMOVCX,BXMOVAX,0L0P2:ADDAX,BXLOOPLOP2ADDDX,AXCMPDX51000JBELOPlMOVAH,4CHINT21HCODEENDSENDSTART4-26数据区中有一段英文字符串ENGLISH。试编写一个程序,查对单词SUN在该字符串中出现的
20、次数,并按后面的格式显示其出现次数:“SUN:XXXX。(英文字符串自设)解:DSEGSEGMENTENGLISHDB4THISISSUN,SUN,SUN,DISPDBSUM:DATDBt0000,tS,KEYWORDDBSUNDSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGES:DSEGMAINPROCFARSTART:PUSHDSSUBAX,AXPUSHAXMOVAX,DSEGMOVDS,AXMOVES,AXBEGIN:MOVAX,OMOVDX,DISPLEABX,ENGLISHCOMP:MOVDI,BXLEASI,KEYWORDMOVCX,3REPECMP
21、SBJNZNO-MATCHINCAXNO_MATCH:INCBXDECDXJNZCOMPDONE:MOVCH,4MOVCL,4LEABX,DATD0NE1:ROLAX,CLMOVDX,AXANDDX,OFHADDDL,30HCMPDL,39HJLESTOREADDDL,07HSTORE:MOVBX,DLINCBXDEXCHJNEDONElDISPLAT:LEADX,DISPMOVAH,09HINT21HRETMAINENDPCSEGENDSENDSTART4-27数据区存放着一字节数组BLOCK1其个数为任意),均为组合的十进制数。试编写一程序求该数组之和,并存入SUM单元(和1字节)。解:D
22、ATASEGMETBlockDB00,11,22,33,COUNTEQUS-BlockSUMDB2DUP(?)DATAENDSSTACKSEGMENTPARASTACK4STACK,DW20HDUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATAMOVDS,AXLEABX,BlockLEACLCDI,SUMMOVCX,COUNTXORAX,AXMOVAL.BXN01:INCBXADCDAAAL,BXLOOPNOlMOVDI,ALMOVDI1,AHMOVAH,4CHINT21HCODEENDSENDBEGI
23、N4-28有两个长度为8字节BCD数,试编写一程序求此二数之和。其和放入被加数单元(和的长度不变)。解,START: MOVMOVMOVMOV MOVCLDCLCADT; CALL LOOPMOV ,AX, DATADS, AXSI, OFFSET FIRST DI, OFFSET SECOND CX, 08HADSUBADTAH, 4CHDATASEGMENTFIRSTDB11,22,33,44,;共8字节SECONDDB55,66,77,88,;共8字节DATAENDSSTACKSEGMENTPARASTACKtSTACK,DB20DUP(?)STACKENDSCODESEGMENTASS
24、UMECS:CODE,DS:DATA,SS:STACKINT21HADSUB:PROCNEARLODSBADCAL,DIDAAMOVSI,ALINCDIRETADSUBENDPCODEENDSENDSTART4-29试编写一个程序,对字变量ONE和TWO进行比拟,假设相等,那么调用子程序ALLSAME显示0;否那么调用子程序NoTSAME显示“1。子程序ALLSAME和子程序NOTSAME也自行编写。并写出它们的说明文件。解:DSEGSEGMENTONEDB?TWODB?DSEGSEGMENTASSUMECS:CSEG,DS:DSEGMAINPROCFARSTART:PUSHDSXORAX,A
25、XPUSHAXMOVAX,DSEGMOVDS,AXMOVAL,ONECMPAL,TWOJECSAMECALLNOTSAMEJMPCONXCSAME:CALLALLSAMECONX:RETALLSAMEPROCNEARMOVDLJ(TMOVAH,02HINT21HRETALLSAMEENDPNOTSAMEPROCNEARMOVDL1,MOVAH,02HINT21HRETNOTSAMEENDPCSEGENDSENDSTART子程序说明文件:以便用户使用。一个书写完备的子程序,不但要按照一定的书写格式,而且还应提供说明文件,子程序文本通常包括:子程序名子程序功能描述子程序入出口参数 子程序中使用了哪些存放器、存储单元子程序是否调用了其他子程序子程序的调用形式及应用举例。以ALLSAME子程序为例:子程序名:ALLSAME子程序功能描述:用于显示字符O子程序入口参数:(DL)=O 子程序出口参数:无 子程序中使用的存放器:DX,AX子程序是否调用了其他子程序;无