您好,欢迎访问三七文档
1、下面的程序段有错吗?若有,请指出错误。CRAYPROCPUSHAXADDAX,BXRETENDPCRAY2、已知堆栈寄存器SS的内容是0F0A0H,堆栈指示器SP的内容是00B0H,先执行两条把8057H和0F79BH分别入栈的PUSH指令,然后执行一条POP指令。试画出示意图说明堆栈及SP内容的变化过程。3、写一段子程序SKIPLINES,完成输出空行的功能。空出的行数在AX寄存器中。答:程序如下:CSEGSEGMENTSKIPLINESPROCFARASSUMECS:CSEGBEGIN:PUSHCXPUSHDXMOVCX,AXDISP:MOVDL,0DH;MOVAH,2;INT21HMOVDL,0AHMOVAH,2;显示一个字符的DOS调用INT21HLOOPDISPPOPDXPOPCXRETSKIPLINESENDPEND4、设有10个学生的成绩分别是76,69,84,90,73,88,99,63,100和80分。试编制一个子程序统计60~69分,70~79分,80~89分,90~99分和100分的人数,分别存放到S6,S7,S8,S9和S10单元中。答:程序如下:DSEGSEGMENTRECORDDW76,69,84,90,73,88,99,63,100,80S6DW0S7DW0S8DW0S9DW0S10DW0DSEGENDS;******************************************CSEGSEGMENTMAINPROCFARASSUMECS:CSEG,DS:DSEGSTART:PUSHDS;设置返回DOSSUBAX,AXPUSHAXMOVAX,DSEGMOVDS,AX;BEGIN:MOVCX,10CALLCOUNT┇;后续程序RETMAINENDP;--------------------------------------------------------------------------COUNTPROCNEAR;成绩统计子程序MOVSI,0NEXT:MOVAX,RECORD[SI]MOVBX,10;DIVBL;计算公式为:((成绩)/10-6)*2送(BX)MOVBL,AL;SUBBX,6;应为只统计60分以上成绩SALBX,1;(BX)*2INCS6[BX];S6是S6,S7,S8,S9和S10单元的首地址ADDSI,2LOOPNEXTRETCOUNTENDP;COUNT子程序结束;--------------------------------------------------------------------------CSEGENDS;以上定义代码段;******************************************ENDSTART5、编写一个有主程序和子程序结构的程序模块。子程序的参数是一个N字节数组的首地址TABLE,数N及字符CHAR。要求在N字节数组中查找字符CHAR,并记录该字符出现的次数。主程序则要求从键盘接收一串字符以建立字节数组TABLE,并逐个显示从键盘输入的每个字符CHAR以及它在TABLE数组中出现的次数。(为简化起见,假设出现次数≤15,可以用16进制形式把它显示出来。)答:程序如下:DSEGSEGMENTTABLEDB255DUP(?)NDW255CHARDB?CHAR_NDB0;CRLFDB0DH,0AH,‘$’DSEGENDS;;******************************************STACKSEGMENTDW100DUP(?)TOSLABELWORDSTACKENDS;以上定义堆栈段;******************************************CSEGSEGMENTMAINPROCFARASSUMECS:CSEG,DS:DSEG,SS:STACKSTART:MOVAX,STACKMOVSS,AX;MOVSP,OFFSETTOS;PUSHDS;SUBAX,AXPUSHAXMOVAX,DSEGMOVDS,AX;BEGIN:MOVBX,0MOVCX,255;INPUT:MOVAH,1;INT21HCMPAL,0DH;JZIN_NMOVTABLE[BX],ALINCBXLOOPINPUTIN_N:MOVN,BX;TABLE数组中的字符个数送NCALLDISP_CRLFIN_CHAR:MOVAH,1;INT21HCMPAL,0DH;JZEXITMOVCHAR,AL;CALLSEARCH;MOVDL,‘:’;MOVAH,2;INT21HMOVDL,CHAR_N;ANDDL,0FHADDDL,30HCMPDL,39HJBENEXTADDDL,07H;是A~FNEXT:MOVAH,2;INT21HCALLDISP_CRLFJMPSHORTIN_CHAREXIT:RETMAINENDP;--------------------------------------------------------------------------SEARCHPROCNEAR;MOVSI,0MOVCX,NMOVCHAR_N,0MOVAL,CHARROTATE:CMPAL,TABLE[SI]JNZROTATE1INCCHAR_N;ROTATE1:INCSILOOPROTATERETSEARCHENDP;;--------------------------------------------------------------------------DISP_CRLFPROCNEAR;LEADX,CRLFMOVAH,09HINT21HRETDISP_CRLFENDP;;--------------------------------------------------------------------------CSEGENDS;;******************************************ENDSTART6、编写子程序嵌套结构的程序,把整数分别用二进制和八进制形式显示出来。主程序BANDO:把整数字变量VAL1存入堆栈,并调用子程序PAIRS;子程序PAIRS:从堆栈中取出VAL1;调用二进制显示程序OUTBIN显示出与其等效的二进制数;输出8个空格;调用八进制显示程序OUTOCT显示出与其等效的八进制数;调用输出回车及换行符子程序。答:程序如下:DSEGSEGMENTVAL1DW?CRLFDB0DH,0AH,‘$’DSEGENDS;以上定义数据段;******************************************CSEGSEGMENTBANDOPROCFAR;ASSUMECS:CSEG,DS:DSEGSTART:PUSHDS;SUBAX,AXPUSHAXMOVAX,DSEGMOVDS,AX;给DS赋值PUSHVAL1CALLPAIRSRETBANDOENDP;--------------------------------------------------------------------------PAIRSPROCNEAR;PAIRS子程序PUSHBPMOVBP,SPPUSHBXMOVBX,[BP+4];从堆栈中取出VAL1CALLOUTBIN;MOVCX,8;显示8个空格符SPACE:MOVDL,‘’MOVAH,2INT21HLOOPSPACECALLOUTOCT;CALLDISP_CRLFPOPBXPOPBPRET2PAIRSENDP;PAIRS子程序结束;--------------------------------------------------------------------------OUTBINPROCNEAR;PUSHBXMOVCX,16ONEBIT:ROLBX,1MOVDX,BXANDDX,1ORDL,30H;转换为ASCII码MOVAH,2INT21HLOOPONEBITPOPBXRETOUTBINENDP;OUTBIN子程序结束;--------------------------------------------------------------------------OUTOCTPROCNEAR;八进制显示子程序ROLBX,1;16位二进制数包含6位八进制数,最高位仅1位MOVDX,BXANDDX,1ORDL,30H;转换为ASCII码MOVAH,2INT21HMOVCX,5;余下还有5位八进制数NEXT:PUSHCXMOVCL,3;ROLBX,CLMOVDX,BXANDDX,07HORDL,30H;MOVAH,2INT21HPOPCXLOOPNEXTRETOUTOCTENDP;OUTOCT子程序结束;--------------------------------------------------------------------------DISP_CRLFPROCNEAR;显示回车换行符子程序LEADX,CRLFMOVAH,09HINT21HRETDISP_CRLFENDP;DISP_CRLF子程序结束;--------------------------------------------------------------------------CSEGENDS;以上定义代码段;******************************************ENDSTART7、主程序CALLMUL定义堆栈段、数据段和代码段,并把段寄存器初始化,数据段中定义变量QTY和PRICE;代码段中将PRICE装入AX,QTY装入BX,然后调用子程序SUBMUL。程序SUBMUL没有定义任何数据,它只简单地把AX中的内容(PRICE)乘以BX中的内容(QTY),乘积放在DX:AX中。请编制这两个要连接起来的程序。答:程序如下:TITLECALLMUL;主程序EXTRNSUBMUL:FAR;-----------------------------------------------------------------STACKSEGMENTPARASTACK‘STACK’DW64DUP(?)TOSLABELWORDSTACKENDS;--------------------------------------------------------------DATASGSEGMENTPARA‘DATA’QTYDW0140HPRICEDW2500HDATASGENDS;--------------------------------------------------------------CODESGSEGMENTPARA‘CODE’CALLMULPROCFARASSUMECS:CODESG,DS:DATASG,SS:STACKSTART:MOVAX,STACKMOVSS,AX;给SS赋值MOVSP,OFFSETTOS;PUSHDSSUBAX,AXPOPAXMOVAX,DATASGMOVDS,AXMOVAX,PRICEMOVBX,QTYCALLSUBMULRETCALLMULENDPCODESGENDS;-----------------------------------------------------------------ENDCALLMUL;***************************************************************TITLESUBMUL;子程序PUBLICSUBMUL;-----------------------------------------------------------------CODESG1SEGMENTPARA‘CODE’ASSUMECS:CODESG1SUBMULPROCFARASSUMECS:
本文标题:第五次作业
链接地址:https://www.777doc.com/doc-6059310 .html