ch03 汇编语言程序设计.docx
《ch03 汇编语言程序设计.docx》由会员分享,可在线阅读,更多相关《ch03 汇编语言程序设计.docx(19页珍藏版)》请在冰豆网上搜索。
![ch03 汇编语言程序设计.docx](https://file1.bdocx.com/fileroot1/2023-1/14/2da771f0-37d4-4e34-9942-4b168129f1e0/2da771f0-37d4-4e34-9942-4b168129f1e01.gif)
ch03汇编语言程序设计汇编语言程序设计CH03汇编语言程序设计习题与思考题1下列语句在存储器中分别为变量分配多少字节空间并画出存储空间的分配图。
VAR1DB10,2VAR2DW5DUP(),0VAR3DBHOWAREYOU,$,3DUP(1,2)VAR4DD-1,1,0解答:
字节空间-VAR1:
2;VAR2:
12;VAR3:
19;VAR4:
12。
存储空间的分配图:
DS:
00000A02000000000000000000000000484F0010572041524520594F553F240102010201002002FFFFFFFF01000000000000002假定VAR1和VAR2为字变量,LAB为标号,试指出下列指令的错误之处。
(1)ADDVAR1,VAR2
(2)SUBAL,VAR1(3)JMPLABCX(4)JNZVAR1(5)MOV1000H,100(6)SHLAL,4解答:
(1)两个操作数中至少有一个为寄存器;
(2)AL为字节,VAR1为字变量,不匹配;(3)中不能用CX;(4)转向地址应为标号;(5)目的操作数的类型不确定;(6)SHL指令中,当所移位数超过1时,必须用CL或CX来取代所移位数。
3对于下面的符号定义,指出下列指令的错误。
A1DBA2DB10K1EQU1024
(1)MOVK1,AX
(2)MOVA1,AX(3)CMPA1,A2(4)K1EQU2048解答:
(1)K1为常量,不能用MOV指令赋值;
(2)A1为字节,AX为字变量,不匹配;(3)A1未定义,无法做比较指令;(4)K1重新赋值前,必须用PURGE释放。
4数据定义语句如下所示:
FIRSTDB90H,5FH,6EH,69HSECONDDB5DUP()THIRDDB5DUP()自FIRST单元开始存放的是一个四字节的十六进制数(低位字节在前),要求:
编一段程序将这个数左移两位后存放到自SECOND开始的单元,右移两位后存放到自THIRD开始的单元。
(注意保留移出部分)解答:
DATASEGMENTFIRSTDB90H,5FH,6EH,69HSECONDDB5DUP()THIRDDB5DUP()DATAENDSCODESEGMENTASSUMECS:
CODE,DS:
DATASTART:
MOVAX,DATAMOVDS,AXLEASI,FIRSTLEADI,SECONDMOVCX,2CLC;左移2位MOVAX,SIINCSIINCSIMOVDX,SIPUSHDXPUSHAXROLDX,CLANDDL,03HMOVDI+4,DLROLAX,CLANDAL,03HMOVBL,ALPOPAXPOPDXSHLDX,CLSHLAX,CLORDL,BLMOVDI,AXMOVDI+2,DX;右移2位,类同左移的方法,略MOVAH,4CHINT21HCODEENDSENDSTART5(原14)在当前数据区从400H开始的256个单元中存放着一组数据,试编程序将它们顺序搬移到从A000H开始的顺序256个单元中。
解答:
DATASEGMENTORG400HDAT1DB.;256DUP()ORG0A000HDAT2DB.;256DUP()DATAENDSSTACKSEGMENTSTACKENDSCODESEGMENTASSUMEDS:
DATA,CS:
CODE,SS:
STACK,ES:
DATASTART:
MOVAX,DATAMOVDS,AX;CH3-14LEASI,DAT1LEADI,DAT2MOVCX,128AGAIN:
MOVAL,SIMOVDI,ALINCSIINCDILOOPAGAIN;CH3-15,将两个数据块逐个单元进行比较,若有错BL=00H,否则BL=FFHLEASI,DAT1LEADI,DAT2MOVCX,128NEXT:
MOVAL,SIMOVBL,DICMPAL,BLJNZERRORINCSIINCDILOOPNEXTMOVBL,0FFHJMPEXITERROR:
MOVBL,00HEXIT:
MOVAX,4C00HINT21HCODEENDSENDSTART6试编程序将当前数据区从BUFF开始的4K个单元中均写入55H,并逐个单元读出比较,看写入的与读出的是否一致。
若全对,则将ERR单元置0H;如果有错,则将ERR单元置FFH。
解答:
DATASEGMENTBUFFDB1000HDUP()ERRDBDATAENDSCODESEGMENTASSUMECS:
CODE,DS:
DATASTART:
MOVAX,DATAMOVDS,AX;将55H依次放入BUFF开始的4K个单元LEASI,BUFFMOVCX,1000HMOVAL,55HNTXT:
MOVSI,ALINCSILOOPNEXT;取出与55H比较,全对则ERR=0,否则ERR=FFHLEADI,BUFFLEASI,ERRMOVCX,1000HNEXT1:
MOVAL,DIINCDICMPAL,55HJNZERROR;若有一个不同,即置ERR=FFHLOOPNEXT1MOVAL,00HMOVSI,AL;全比较完无错,则置ERR=0JMPEXITERROR:
MOVAL,0FFHMOVSI,AL;返回DOSEXIT:
MOVAH,4CHINT21HCODEENDSENDSTARTEND7在上题中,如果发现有错时,要求在ERR单元中存放出错的数据个数,则程序该如何修改解答:
DATASEGMENTBUFFDB1000HDUP()ERRDWDATAENDSCODESEGMENTASSUMECS:
CODE,DS:
DATASTART:
MOVAX,DATAMOVDS,AX;将55H依次放入BUFF开始的4K个单元LEASI,BUFFMOVCX,1000HMOVAL,55HNTXT:
MOVSI,ALINCSILOOPNEXT;取出与55H比较LEADI,BUFFLEASI,ERRMOVDX,0000HMOVCX,1000HNEXT1:
MOVAL,DIINCDICMPAL,55HJZNEXT2;若相同,则比较下一个INCDX;否则将放出错个数的DX加1NEXT2:
LOOPNEXT1MOVSI,DXEXIT:
MOVAH,4CHINT21HCODEENDSENDSTARTEND8试编写程序段,完成将数据区从0100H开始的一串字节数据逐个从F0H端口输出,已知数据串以0AH为结束符。
(略)9(原24)内存中以FIRST和SECOND开始的单元中分别存放着两个4位用压缩BCD码表示的十进制数,低位在前。
编程序求这两个数的和,仍用压缩BCD码表示,并存到以THIRD开始的单元。
解答:
DATASEGMENTFIRSTDW3412HSECONDDW7856HTHIRDDB,DATAENDSSTACKSEGMENTSTACKENDSCODESEGMENTASSUMEDS:
DATA,CS:
CODE,SS:
STACK,ES:
DATASTART:
MOVAX,DATAMOVDS,AXLEASI,FIRSTLEADI,SECONDLEABX,THIRDMOVCX,2CLCAGAIN:
MOVAL,BYTEPTRSIMOVDL,BYTEPTRDIADCAL,DLDAAMOVBYTEPTRBX,ALINCSIINCDIINCBXLOOPAGAINJCAAMOVBYTEPTRBX,0JMPEXITAA:
MOVBYTEPTRBX,1EXIT:
MOVAX,4C00HINT21HCODEENDSENDSTART10(原27)设字变量单元A、B、C存放有三个数,若三个数都不为零,则求三个数的和,存放在D中;若有一个为零,则将其余两个也清零,试编写程序。
解答:
DATASEGMENTADBBDBCDBDDWDATAENDSSTACKSEGMENTSTACKENDSCODESEGMENTASSUMEDS:
DATA,CS:
CODE,SS:
STACK,ES:
DATASTART:
MOVAX,DATAMOVDS,AXLEASI,ALEADI,DMOVAL,SICMPAL,00JZZEROADCDX,ALLEASI,BMOVAL,SICMPAL,00JZZEROADCDX,ALLEASI,CMOVAL,SICMPAL,00JZZEROADCDX,ALMOVDI,DXJMPEXITZERO:
MOVAL,0MOVA,ALMOVB,ALMOVC,ALEXIT:
MOVAX,4C00HINT21HCODEENDSENDSTART11(16)试编程序,统计由TABLE开始的128个单元中所存放的字符“A”的个数,并将结果存放在DX中。
解答:
DATASEGMENTTABLEDBX1,X2,.X128DATAENDSSTACKSEGMENTSTACKENDSCODESEGMENTASSUMEDS:
DATA,CS:
CODE,SS:
STACK,ES:
DATASTART:
MOVAX,DATAMOVDS,AXLEASI,TABLEMOVDX,0MOVCX,128AGAIN:
MOVAL,SICMPAL,AJNZNEXTINCDXNEXT:
INCSILOOPAGAINMOVAX,4C00HINT21HCODEENDSENDSTART12试编制一个汇编语言程序,求出首地址为DATA的1000个字数组中的最小偶数,并把它存放于MIN单元中。
(方法:
利用书上排序的例题做相应的修改即可,略)13在上题中,如果要求同时找出最大和最小的偶数,并把它们分别存放于MAX和MIN单元中,试完成程序。
解答:
略(方法同第12题)。
14(28)在DATA字数组中存放有100H个16位补码数,试编写一程序求它们的平均值,放在AX中,并求出数组中有多少个数小于平均值,将结果存于BX中。
(略)15(17)编写一个子程序,对AL中的数据进行偶校验,并将经过校验的结果放回AL中。
解答:
DATASEGMENTCOUNTEQU7DATAENDSSTACKSEGMENTSTACKENDSCODESEGMENTASSUMEDS:
DATA,CS:
CODE,SS:
STACK,ES:
DATASTART:
MOVAX,DATAMOVDS,AXPUSHAXMOVDX,0MOVCX,COUNTAGAIN:
RCRAL,1JNCLINCDXL:
LOOPAGAINPOPAXTESTDX,01JZEXITORAL,80EXIT:
MOVAX,4C00HINT21H;ANOTHERMETHORDJPEXITORAL,80HEXIT:
MOVAX,4C00HINT21HCODEENDSENDSTART16(18)利用上题的予程序,对DATA开始的256个单元的数据加上偶校验,试编程序。
解答:
DATASEGMENTDATDB.;256DUP()RESULTDB.;256DUP()NUMEQU256COUNTEQU7DATAENDSSTACKSEGMENTSTACKENDSCODESEGMENTASSUMEDS:
DATA,CS:
CODE,SS:
STACK,ES:
DATASTART:
MOVAX,DATAMOVDS,AXLEASI,DATLEADI,RESULTMOVCX,NUMNEXT:
MOVAL,SICALLSUB1MOVDI,AL;MOVSI,ALINCSIINCDILOOPNEXTMOVAX,4C00HINT21HSUB1PROCPUSHAXMOVDX,0MOVCX,COUNTAGAIN:
RCRAL,1JNCLINCDXL:
LOOPAGAINPOPAXTESTDX,01JZQUITORAL,80HQUIT:
RETSUB1ENDPCODEENDSENDSTART17(19)试编写程序实现将键盘输入的小写字母转换成大写字母并输出。
解答:
DATASEGMENTMESSDBTHEINPUTISNOTCORRECT.,0DH,0AH,$DATAENDSSTACKSEGMENTSTACKENDSCODESEGMENTASSUMEDS:
DATA,CS:
CODE,SS:
STACK,ES:
DATASTART:
MOVAX,DATAMOVDS,AXNEXT:
MOVAH,01HINT21HCMPAL,QJZEXITCMPAL,aJBERRORCMPAL,zJAERRORSUBAL,20HMOVAH,02HMOVDL,ALINT21HJMPNEXTERROR:
MOVAH,09HLEADX,MESSINT21HJMPNEXTEXIT:
MOVAX,4C00HINT21HCODEENDSENDSTART18从键盘接收20个字符,按键入顺序查找最大的字符,并显示输出。
解答:
DATASEGMENTDATDB20DUP()DATAENDSSTACKSEGMENTSTACKENDSCODESEGMENTASSUMEDS:
DATA,CS:
CODE,SS:
STACK,ES:
DATASTART:
MOVAX,DATAMOVDS,AX;从键盘接收20个字符,并送DAT中保存LEASI,DATMOVCX,20NEXT:
MOVAH,01HINT21HMOVSI,ALINCSILOOPNEXT;比较20个字符中的最大字符,并放入AL中MOVCX,19LEASI,DATMOVAL,SIINCSINEXT1:
CMPAL,SIJAELLMOVAL,SILL:
INCSILOOPNEXT1;将最大的字符的ASCII码由AL送DL显示MOVDL,ALMOVAH,2HINT21H;返回DOSMOVAX,4C00HINT21HCODEENDSENDSTART19(29)编写汇编程序,接收从键盘输入的10个数,输入回车符表示结束,然后将这些数加密后存于BUFF缓冲区中。
加密表为:
输入数字:
0,1,2,3,4,5,6,7,8,9;密码数字:
7,5,9,1,3,6,8,0,2,4解答:
DATASEGMENTBUFFDB10DUP()TABLEDB7,5,9,1,3,6,8,0,2,4DATAENDSSTACKSEGMENTSTACKENDSCODESEGMENTASSUMEDS:
DATA,CS:
CODE,SS:
STACK,ES:
DATASTART:
MOVAX,DATAMOVDS,AX;LEADI,BUFFNEXT:
MOVAH,01HINT21H;从键盘上接收单个字符CMPAL,0AH;与0AH比,判是否要结束JZEXITSUBAL,30H;否则,将09的ASCII码转换为十进制数LEABX,TABLEXLAT;用查表指令进行加密MOVDI,ALINCDIJMPNEXT;退出并返回DOSEXIT:
MOVAX,4C00HINT21HCODEENDSENDSTART20(23)有一个100个字节的数据表,表内元素已按从大到小的顺序排列好,现给定一元素,试编程序在表内查找,若表内已有此元素,则结束;否则,按顺序将此元素插入表中适当的位置,并修改表长。
(略)21(26)在当前数据段(DS),偏移地址为DATAB开始的顺序80个单元中,存放着某班80个同学某门考试成绩。
按要求编写程序:
编写程序统计90分;80分89分;70分79分;60分69分,60分的人数各为多少,并将结果放在同一数据段、偏移地址为BTRX开始的顺序单元中。
试编程序,求该班这门课的平均成绩为多少,并放在该数据段的AVER单元中。
解答:
;统计学生成绩DATASEGMENTDATABDBX1,X2,.,X80NEQU$-DATABORG100HBTRXDW0S8DW0S7DW0S6DW0S5DW0ORG110HAVERDWDATAENDSSTACKSEGMENTSTACKSTADB20DUP(0)TOPEQU$STASTACKENDSCODESEGMENTMAINPROCFARASSUMECS:
CODE,DS:
DATA,SS:
STACKSTART:
PUSHDSSUBAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVCX,NMOVBX,0000HMOVDX,0000HLEASI,DATAB;成绩表首地址COMPARE:
MOVAL,SICMPAL,60;60JLFIVECMPAX,70;70JLSIXCMPAX,80;80JLSEVENCMPAX,90;90JLEIGHTINCS9JMPCHAEIGHT:
INCS8JMPCHASEVEN:
INCS7JMPCHASIX:
INCS6JMPCHAFIVE:
INCS5JMPCHACHA:
ADDBX,ALJNCNEXTADCDX,0NEXT:
INCSI;循环学生人数LOOPCOMPAREMOVAX,BXMOVCX,NDIVCXMOVAVER,AXMOVAH,4CHINT21HRETMAINENDPCODEENDSENDSTART