CH03汇编语言程序设计习题与思考题1.下列语句在存储器中分别为变量分配多少字节空间?并画出存储空间的分配图。VAR1DB10,2VAR2DW5DUP(?),0VAR3DB‘HOWAREYOU?’,3DUP(1,2)VAR4DD-1,1,0解答:字节空间----VAR1:2;VAR2:12;VAR3:20;VAR4:12。存储空间的分配图:DS:00000A02000000000000—000000000000484F00105720204152452020—594F553F0102010200200102FFFFFFFF0100—0000000000002.假定VAR1和VAR2为字变量,LAB为标号,试指出下列指令的错误之处。(1)ADDVAR1,VAR2(2)SUBAL,VAR1(3)JMPLAB[CX](4)JNZVAR1(5)MOV[1000H],100(6)SHLAL,4解答:(1)两个操作数中至少有一个为寄存器;(2)AL为字节,VAR1为字变量,不匹配;(3)[]中不能用CX,LAB为标号,非变量;(4)转向地址应为标号,不能是变量;(5)目的操作数的类型不确定;(6)SHL指令中,当所移位数超过1时,必须用CL或CX来取代所移位数。3.对于下面的符号定义,指出下列指令的错误。A1DB?A2DB10K1EQU1024(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,[SI];AX=5F90H为低十六位数据INCSIINCSIMOVDX,[SI];DX=696EH为高十六位数据PUSHDX;保存原有的高十六位数据PUSHAX;保存原有的低十六位数据ROLDX,CL;将高位数据不带进位循环左移两位,即高2位数据在DL的低2位ANDDL,03H;让DL中仅保存移出的高2位数据MOV[DI+4],DL;将移出的高2位数据放入SECOND中的最高单元中ROLAX,CL;将低位数据不带进位循环左移两位,即AX的高2位在AL的低2位ANDAL,03H;让AL中仅保存移出的AX高2位数据MOVBL,AL;将AL中的数据放入BL中保存POPAX;弹出原有的低十六位数据POPDX;弹出原有的高十六位数据SHLDX,CL;将高位数据算术逻辑左移2位SHLAX,CL;将低位数据算术逻辑左移2位ORDL,BL;将AX中移出的高2位数据放入DX的低2位MOV[DI],AXMOV[DI+2],DX;右移2位LEASI,FIRSTLEADI,THIRDMOVCX,2CLCMOVAX,[SI];AX=5F90H为低十六位数据INCSIINCSIMOVDX,[SI];DX=696EH为高十六位数据PUSHDX;保存原有的高十六位数据PUSHAX;保存原有的低十六位数据RORAX,CL;将低位数据不带进位循环右移两位,即低2位数据在AH的高2位ANDAH,0C0H;让AH中仅保存移出的低2位数据PUSHCXMOVCX,6SHRAH,CLPOPCXMOV[DI],AH;将移出的低2位数据放入THIRD中的最低单元中RORDX,CL;将低位数据不带进位循环左移两位,即AX的高2位在AL的低2位ANDDH,0C0H;让DH中仅保存移出的DX低2位数据MOVBL,DH;将DH中的数据放入BL中保存POPAX;弹出原有的低十六位数据POPDX;弹出原有的高十六位数据SHRDX,CL;将高位数据算术逻辑左移2位SHRAX,CL;将低位数据算术逻辑左移2位ORAH,BL;将DX中移出的低2位数据放入AX的高2位MOV[DI+1],AXMOV[DI+3],DXMOVAH,4CHINT21HCODEENDSENDSTART5.(14)在当前数据区从400H开始的256个单元中存放着一组数据,试编程序将它们顺序搬移到从A000H开始的顺序256个单元中。解答:DATASEGMENTORG400HDAT1DB...;256DUP(?)ORG0A000HDAT2DB...;256DUP(?)DATAENDS;STACKSEGMENTSTACKENDS;CODESEGMENTASSUMEDS:DATA,CS:CODE,SS:STACK,ES:DATASTART:MOVAX,DATAMOVDS,AX;CH3-14LEASI,DAT1LEADI,DAT2MOVCX,128AGAIN:MOVAL,[SI]MOV[DI],ALINCSIINCDILOOPAGAIN;CH3-15,将两个数据块逐个单元进行比较,若有错BL=00H,否则BL=FFHLEASI,DAT1LEADI,DAT2MOVCX,128NEXT:MOVAL,[SI]MOVBL,[DI]CMPAL,BLJNZERRORINCSIINCDILOOPNEXTMOVBL,0FFHJMPEXITERROR:MOVBL,00HEXIT:MOVAX,4C00HINT21HCODEENDSENDSTART6.试编程序将当前数据区从BUFF开始的4K个单元中均写入55H,并逐个单元读出比较,看写入的与读出的是否一致。若全对,则将ERR单元置0H;如果有错,则将ERR单元置FFH。解答:DATASEGMENTBUFFDB1000HDUP(?)ERRDB?DATAENDS;CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;将55H依次放入BUFF开始的4K个单元LEASI,BUFFMOVCX,1000HMOVAL,55HNTXT:MOV[SI],ALINCSILOOPNEXT;取出与55H比较,全对则ERR=0,否则ERR=FFHLEADI,BUFFLEASI,ERRMOVCX,1000HNEXT1:MOVAL,[DI]INCDICMPAL,55HJNZERROR;若有一个不同,即置ERR=FFHLOOPNEXT1MOVAL,00HMOV[SI],AL;全比较完无错,则置ERR=0JMPEXITERROR:MOVAL,0FFHMOV[SI],AL;返回DOSEXIT:MOVAH,4CHINT21HCODEENDSENDSTARTEND7.在上题中,如果发现有错时,要求在ERR单元中存放出错的数据个数,则程序该如何修改?解答:DATASEGMENTBUFFDB1000HDUP(?)ERRDW?DATAENDS;CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;将55H依次放入BUFF开始的4K个单元LEASI,BUFFMOVCX,1000HMOVAL,55HNTXT:MOV[SI],ALINCSILOOPNEXT;取出与55H比较LEADI,BUFFLEASI,ERRMOVDX,0000HMOVCX,1000HNEXT1:MOVAL,[DI]INCDICMPAL,55HJZNEXT2;若相同,则比较下一个INCDX;否则将放出错个数的DX加1NEXT2:LOOPNEXT1MOV[SI],DX;EXIT:MOVAH,4CHINT21HCODEENDSENDSTARTEND8.试编写程序段,完成将数据区从0100H开始的一串字节数据逐个从F0H端口输出,已知数据串以0AH为结束符。解答:DATASEGMENTORG0100HDATA1DBNDUP(?)DATAENDS;CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;将DATA1数据串中的数据取出并从F0H端口中输出LEASI,DATA1MOVCX,NMOVBL,0AHNTXT:MOVAL,[SI]CMPAL,BLJZEXITOUT0F0H,ALINCSILOOPNEXT;返回DOSEXIT:MOVAH,4CHINT21HCODEENDSENDSTARTEND9.(24)内存中以FIRST和SECOND开始的单元中分别存放着两个4位用压缩BCD码表示的十进制数,低位在前。编程序求这两个数的和,仍用压缩BCD码表示,并存到以THIRD开始的单元。解答:DATASEGMENTFIRSTDW3412HSECONDDW7856HTHIRDDB?,?,?DATAENDS;STACKSEGMENTSTACKENDS;CODESEGMENTASSUMEDS:DATA,CS:CODE,SS:STACK,ES:DATASTART:MOVAX,DATAMOVDS,AXLEASI,FIRSTLEADI,SECONDLEABX,THIRDMOVCX,2CLCAGAIN:MOVAL,BYTEPTR[SI]MOVDL,BYTEPTR[DI]ADCAL,DLDAAMOVBYTEPTR[BX],ALINCSIINCDIINCBXLOOPAGAINJCAAMOVBYTEPTR[BX],0JMPEXITAA:MOVBYTEPTR[BX],1EXIT:MOVAX,4C00HINT21HCODEENDSENDSTART10.(27)设字变量单元A、B、C存放有三个数,若三个数都不为零,则求三个数的和,存放在D中;若有一个为零,则将其余两个也清零,试编写程序。解答:DATASEGMENTADB?BDB?CDB?DDW?DATAENDS;STACKSEGMENTSTACKENDS;CODESEGMENTASSUMEDS:DATA,CS:CODE,SS:STACK,ES:DATASTART:MOVAX,DATAMOVDS,AXLEASI,ALEADI,DMOVAL,[SI]CMPAL,00JZZEROADCDX,ALLEASI,BMOVAL,[SI]CMPAL,00JZZEROADCDX,ALLEASI,CMOVAL,[SI]CMPAL,00JZZEROADCDX,ALMOV[DI],DXJMPEXITZERO:MOVAL,0MOVA,ALMOVB,ALMOVC,AL;EXIT:MOVAX,4C00HINT21HCODEENDSENDSTART11.(16)试编程序,统计由TABLE开始的128个单元中所存放的字符“A”的个数,并将结果存放在DX中。解答:DATASEGMENTTABLEDBX1,X2,...X128DATAENDS;STACKSEGMENTSTACKENDS;CODESEGMENTASSUMEDS:DATA,CS:CODE,SS:STACK,ES:DATASTART:MOVAX,DATAMOVDS,AXLEASI,TABLEMOVDX,0MOVCX,128AGAIN:MOVAL,[SI]CMPAL,'A'JNZNEXTINCDXNEXT:INCSILOOPAGAINMOVAX,4C00HINT21HCODEENDSENDSTART12.试编制一个汇编语言程序,求出首地址为DATA的1000个字数组中的最小偶数,并把它存放于MIN单元中。解答:DATASEGMENTARRAYDWX1,X2,...X1000ARRAY_EVENDW1000DUP(?)MINDW?