第四章1.下列变量各占多少字节?A1DW23H,5876HA2DB3DUP(?),0AH,0DH,‘$’A3DD5DUP(1234H,567890H)A4DB4DUP(3DUP(1,2,’ABC’))答:A1占4个字节A2占6个字节A3占40个字节A4占60个字节2.下列指令完成什么功能?MOVAX,00FFHAND1122H+3344HMOVAL,15GE1111BMOVAX,00FFHLE255+6/5ANDAL,50MOD4ORAX,0F00FHAND1234OR00FFH答:(1)将0066H传送给AX(2)将0FFH传送给AL(3)将0FFFFH传送给AX(4)ANDAL,02H(5)ORAX,00FFH3.有符号定义语句如下:BUFDB3,4,5,’123’ABUFDB0LEQUABUF-BUF求L的值为多少?答:L=64.假设程序中的数据定义如下:PARDW?PNAMEDB16DUP(?)COUNTDD?PLENTHEQU$-PAR求PLENTH的值为多少?表示什么意义?答:PAR的偏移地址为0,PLENTH当前偏移地址$=2+16+4=22,$-PAR=22,故PLENTH的值为22。若在PLENTH所在行有变量定义,则$表示该变量的偏移地址,即$表示PLENTH所在行的当前偏移地址。故PLENTH表示从当前行到PAR之间定义的变量所占的字节个数。5.对于下面的数据定义,各条MOV指令执行后,有关寄存器的内容是什么?DA1DB?DA2DW10DUP(?)DA3DB‘ABCD’MOVAX,TYPEDA1MOVBX,SIZEDA2MOVCX,LENGTHDA3答:AX=1,BX=20,CX=16.下段程序完成后,AH等于什么?INAL,5FHTESTAL,80HJZL1MOVAH,0JMPSTOPL1:MOVAH,0FFHSTOP:HLT答:讨论从端口5FH输入的数据昀高位的情况。若昀高位为1,则AH=0;若昀高位为0,则AH=0FFH。7.编程序完成下列功能:(1)利用中断调用产生5秒延时。(2)利用中断调用,在屏幕上显示1~9之间随机数。答:(1)可以利用中断类型1CH来处理,因为在系统时钟的中断处理程序中,时钟中断一次要调用一次INT1CH,即每隔55ms,产生一次1CH中断,要产生5秒延时,只要中断5s/55ms=91次即可。又因1CH中断处理程序中只有一条IRET指令,故可将用户的程序代替原有的INT1CH程序。DATASEGMENTCOUNTDW91;计数器MESSDB‘5sdelayed!’,0AH,0DH,’$’DATAENDSCODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATA,ES:DATASTART:PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXMOVAL,1CH;得到原中断向量MOVAH,35HINT21HPUSHES;存储原中断向量PUSHBXPUSHDSMOVDX,OFFSETDELAY;DELAY的偏移地址和段地址MOVAX,SEGDELAYMOVDS,AXMOVAL,1CH;设置中断向量MOVAH,25HINT21HPOPDSINAL,21H;设置中断屏蔽位ANDAL,0FEHOUT21H,ALSTIMOVDI,2000H;主程序延迟,在执行此段程序期间A1:MOVSI,3000H;产生中断A2:DECSIJNZA2DECDIJNZA1POPDX;取原中断向量POPDSMOVAL,1CHMOVAH,25HINT21HRETMAINENDPDELAYPROCNEARPUSHDSPUSHAXPUSHCXPUSHDXMOVAX,DATAMOVDS,AXSTIDECCOUNT;5秒计数JNZEXITMOVDX,OFFSETMESS;显示信息MOVAH,09HINT21HMOVCOUNT,91;5秒的值EXIT:CLIPOPDXPOPCXPOPAXPOPDSIRETDELAYENDPCODEENDSENDSTART(2)可以利用INT1AH,读取当前时间的1/100秒为随机数。CODESEGMENTASSUMECS:CODESTART:MOVAH,0INT1AH;读取当前时间CH:CL=时:分MOVAL,DL;DH:DL=秒:1/100秒MOVAH,0MOVBL,9DIVBLINCAHMOVDL,AHADDDL,30HMOVAH,2INT21HMOVAH,4CHINT21HCODEENDSENDSTART8.编两个通过过程完成将AX中存放的二进制数转换成压缩型BCD码以及将BCD码转换成二进制数。答:(1)将AX中的二进制数先后除以1000,100和10,每次除法所得的商,即是BCD数的千位、百位和十位数,余数是个位数。子程序名:B2TOBCD输入参数:AX=十六位二进制数输出参数:CF=0,则AX=4位压缩型BCD码。CF=1,则要转换的数大于9999,AX不变。使用寄存器:CX:存放除数,DX:存放中间结果。B2TOBCDPROCFARCMPAX,9999;AX9999,则CF置1JBETRANSTCJMPEXITTRAN:PUSHCXPUSHDXSUBDX,DX;DX清0MOVCX,1000;计算千位数DIVCXXCHGAX,DX;商在DX中,余数在AX中MOVCL,4SHLDX,CL;DX左移4位MOVCL,100;计算百位数DIVCLADDDL,AL;百位数加到DL中,DX左移4位MOVCL,4SHLDX,CLXCHGAL,AH;余数保留在AL中SUBAH,AHMOVCL,10;计算十位数DIVCLADDDL,AL;十位数加到DL中,DX左移4位MOVCL,4SHLDX,CLADDDL,AH;加个位数MOVAX,DX;结果送到AX中POPDXPOPCXEXIT:RETB2TOBCDENDP(2)将AX中4位BCD码顺序乘以1000,100,10和1,然后求和即得。子程序名:BCDTOB2输入参数:AX=4位压缩BCD码输出参数:AX=十六位二进制数使用寄存器:BX:暂存数据,CX:存放乘数,DX:存放中间结果BCDTOB2PROCFARPUSHBXPUSHCXPUSHDXMOVBX,AXMOVCL,4ROLAX,CLANDAX,000FHMOVCX,1000;乘以1000MULCXMOVDX,AXMOVAX,BXMOVCL,8ROLAX,CLANDAX,000FHMOVCL,100;乘以100MULCLADDDX,AXMOVAX,BXMOVCL,4SHRAX,CLANDAX,000FHMOVCL,10;乘以10MULCLADDDX,AXANDBX,000FHADDDX,BXMOVAX,DXPOPDXPOPCXPOPBXRETBCDTOB2ENDP9.编写两个通用过程,一个完成ASCII码转换成二进制数功能,另一个完成ASCII字符显示输出功能。答:(1)将AX中两位ASCII码先转化成数字,然后AH*10+AL。子程序名:ASCIITOB2输入参数:AX=2位ASCII码输出参数:AX=转换后二进制数使用寄存器:BX,CX,DXASCIITOB2PROCFARPUSHBXPUSHCXPUSHDXMOVBX,AXSUBAH,30HMOVAL,AHMOVCL,10;乘以10MULCLMOVDX,AXMOVAX,BXSUBAL,30HMOVAH,0ADDAX,DXPOPDXPOPCXPOPBXRETASCIITOB2ENDP(2)使用2号DOS功能调用显示字符。子程序名:DISPLAY输入参数:AX=2位ASCII码输出参数:无使用寄存器:BX,DXDISPLAYPROCFARPUSHBXPUSHDXMOVBX,AXMOVDL,AHMOVAH,2INT21HMOVAX,BXMOVDL,ALMOVAH,2INT21HPOPDXPOPBXRETDISPLAYENDP10.编制两个通用过程,完成十六进制数转换成ASCII码并将ASCII码字符显示。答:(1)子程序名:HEXTOASC输入参数:AX:4位十六进制数输出参数:DX,AX:4位ASCII码,DX高2位,AX低2位使用寄存器:BX,CX,DXHEXTOASCPROCFARPUSHBXPUSHCXPUSHDXMOVBX,AXMOVCL,4;转换AH高4位SHRAX,CLANDAX,0F00HADDAH,30HCMPAH,3AHJBA1ADDAH,7A1:MOVDH,AHMOVAX,BX;转换AH低4位ANDAX,0F00HADDAH,30HCMPAH,3AHJBA2ADDAH,7A2:MOVDL,AHMOVBH,BL;转换AL高4位MOVCL,4SHRBL,CLADDBL,30HCMPBL,3AHJBA3ADDBL,7A3:MOVAH,BLANDBH,0FH;转换AL低4位ADDBH,30HCMPBH,3AHJBA4ADDBH,7A4:MOVAL,BHPOPDXPOPCXPOPBXRETHEXTOASCENDP(2)子程序名:DISPLAYASC输入参数:DX,AX:4位ASCII码输出参数:无使用寄存器:BX,CXDISPLAYASCPROCFARPUSHBXPUSHCXMOVBX,DXMOVCX,AXMOVDL,BHMOVAH,02HINT21HMOVDL,BLINT21HMOVDL,CHINT21HMOVDL,CLINT21HMOVDL,’H’INT21HPOPCXPOPBXRETDISPLAYASCENDP11.某程序可从键盘接收命令(0~5),分别转向6个子程序,子程序入口地址分别为P0~P5,编制程序,用跳转表实现分支结构。答:DATASEGMENTTABLEDW6DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEASI,TABLEMOVWORDPTR[SI],OFFSETP0MOVWORDPTR[SI+2],OFFSETP1MOVWORDPTR[SI+4],OFFSETP2MOVWORDPTR[SI+6],OFFSETP3MOVWORDPTR[SI+8],OFFSETP4MOVWORDPTR[SI+10],OFFSETP5MOVAH,1INT21HSUBAL,30HSHLAL,1MOVAH,0MOVSI,AXJMPTABLE[SI]P0:P1:P2:P3:P4:P5:MOVAH,4CHINT21HCODEENDSENDSTART12.在首地址为TABLE的数组中按递增次序存放着100个16位补码数,编写一个程序,把出现次数昀多的数及其出现次数分别存放于AX和BL中。答:DATASEGMENTTABLEDW100DUP(?);数组中的数据是按增序排列的NUMDW?COUNTDW0DATAENDSCODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATASTART:PUSHDS;设置返回DOSSUBAX,AXPUSHAXMOVAX,DATAMOVDS,AX;给DS赋值BEGIN:MOVCX,100;循环计数器MOVSI,0NEXT:MOVDX,0MOVAX,TABLE[SI]COMP:CMPTABLE[SI],AX;计算一个数的出现次数JNEADDRINCDXADDSI,2LOOPCOMPADDR:CMPDX,COUNT;此数出现的次数昀多吗?JLEDONEMOVCOUNT,DX;目前此数出现的次数昀多,记下次数MOVNUM,AX;记下此数DONE:LOOPNEXT;准备取下一个数MOVCX,COUNT;出现昀多的次数存入(CX)MOVAX,NUM;出现昀多的数存入(AX)RETMAINENDPCODEENDS;以上定义代码段ENDSTART13.将键盘上输入的十六进制数转换成十进制数,在屏幕上显示。答:DATASEGMENTSTRINGDB'INPUT4HEXNUM:',0AH,0DH,'$'NUMDB10DUP(?)DATA