您好,欢迎访问三七文档
6.1下面的程序段有错吗?若有,请指出错误。CRAYPROCPUSHAXADDAX,BXRETENDPCRAY答:程序有错。改正如下:CRAYPROCADDAX,BXRETCRAYENDP;CRAY是过程名,应放在ENDP的前面6.29BHF7H57H80HF0A0:00B0H先PUSH,SP-2再PUSH,SP-2POP,SP+26.2题堆栈及SP内容的变化过程已知堆栈寄存器SS的内容是0F0A0H,堆栈指示器SP的内容是00B0H,先执行两条把8057H和0F79BH分别入栈的PUSH指令,然后执行一条POP指令。试画出示意图说明堆栈及SP内容的变化过程。答:变化过程如右图所示:6.3分析下面的程序,画出堆栈最满时各单元的地址及内容。;********************************************S_SEGSEGMENTAT1000H;定义堆栈段DW200DUP(?);200*2=190HTOSLABELWORDS_SEGENDS;********************************************C_SEGSEGMENT;定义代码段ASSUMECS:C_SEG,SS:S_SEGSTART:MOVAX,S_SEG(FLAGS)(AX)T_ADDR0000(DS)1000:0184:0186:0188:018A:018C:018ESP:01866.3题堆栈最满时各单元的地址及内容MOVSS,AXMOVSP,OFFSETTOSPUSHDSMOVAX,0PUSHAX┇PUSHT_ADDRPUSHAXPUSHF┇POPFPOPAXPOPT_ADDRRET;--------------------------------------------------------------------------C_SEGENDS;代码段结束;******************************************ENDSTART;程序结束答:堆栈最满时各单元的地址及内容如右图所示:6.4分析下面的程序,写出堆栈最满时各单元的地址及内容。;********************************************STACKSEGMENTAT500H;定义堆栈段DW128DUP(?)TOSLABELWORDSTACKENDS;********************************************CODESEGMENT;定义代码段MAINPROCFAR;主程序部分ASSUMECS:CODE,SS:STACKSTART:MOVAX,STACKMOVSS,AXMOVSP,OFFSETTOSPUSHDSSUBAX,AXPUSHAX;MAINPARTOFPROGRAMGOESHEREMOVAX,4321HCALLHTOARETMAINENDP;主程序部分结束;--------------------------------------------------------------------HTOAPROCNEAR;HTOA子程序CMPAX,15JLEB1PUSHAX0500:00EC:00EE:00F0:00F2:00F4:00F6:00F8:00FA:00FC:00FESP:00EE返回POPBP地址0003H返回POPBP地址0002H返回POPBP地址0001H主程序返回地址0000(DS)6.4题堆栈最满时各单元的地址及内容PUSHBPMOVBP,SPMOVBX,[BP+2]ANDBX,000FHMOV[BP+2],BXPOPBPMOVCL,4SHRAX,CLCALLHTOAPOPBPB1:ADDAL,30HCMPAL,3AHJLPRINTITADDAL,7HPRINTIT:MOVDL,ALMOVAH,2INT21HRETHOTAENDP;HOTA子程序结束;--------------------------------------------------------------------CODEENDS;代码段结束;******************************************ENDSTART;程序结束答:堆栈最满时各单元的地址及内容如右上图所示:6.5下面是一个程序清单,请在下面的图中填入此程序执行过程中的堆栈变化。;*************************0000STACKSGSEGMENT000020[.DW32DUP(?)????]0040STACKSGENDS;*************************0000CODESGSEGMENTPARA‘CODE’;--------------------------------------0000BEGINPROCFARASSUMECS:CODESG,SS:STACKSG00001EPUSHDS00012BC0SUBAX,AX000350PUSHAX0004E80008RCALLB10;--------------------------------------0007CBRET0008BEGINENDP;--------------------------------------0008B10PROC0008E8000CRCALLC10;--------------------------------------000BC3RET000CB10ENDP;--------------------------------------000CC10PROC;--------------------------------------000CC3RET000DC10ENDP;--------------------------------------000DCODESGENDS;*************************ENDBEGIN答:程序执行过程中的堆栈变化如下图所示。(0016H)(0018H)(001AH)(001CH)(001EH)(0020H)SP:(DS)(0016H)(0018H)(001AH)(001CH)(001EH)(0020H)0000(DS)(0016H)(0018H)(001AH)(001CH)(001EH)(0020H)00070000(DS)0020H001EH001CH001AH(0016H)(0018H)(001AH)(001CH)(001EH)(0020H)000B00070000(DS)(0016H)(0018H)(001AH)(001CH)(001EH)(0020H)SP:000B00070000(DS)(0016H)(0018H)(001AH)(001CH)(001EH)(0020H)000B00070000(DS)(0016H)(0018H)(001AH)(001CH)(001EH)(0020H)000B00070000(DS)0018H001AH001CH0020H(0016H)(0018H)(001AH)(001CH)(001EH)(0020H)BEGINPUSHDSPUSHAXCALLB10偏移地址堆栈6.6写一段子程序SKIPLINES,完成输出空行的功能。空出的行数在AX寄存器中。答:程序如下:CSEGSEGMENTSKIPLINESPROCFARASSUMECS:CSEGBEGIN:PUSHCXPUSHDXMOVCX,AXDISP:MOVDL,0DH;显示回车换行,即输出空行MOVAH,2;显示一个字符的DOS调用INT21HMOVDL,0AHMOVAH,2;显示一个字符的DOS调用INT21HLOOPDISPPOPDXPOPCXRETSKIPLINESENDPEND6.7设有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;给DS赋值BEGIN:MOVCX,10CALLCOUNT┇;后续程序RETMAINENDP;--------------------------------------------------------------------------COUNTPROCNEAR;成绩统计子程序MOVSI,0NEXT:MOVAX,RECORD[SI]MOVBX,10;以下5句是根据成绩计算相对S6的地址变化量DIVBL;计算公式为:((成绩)/10-6)*2送(BX)MOVBL,AL;此时(BH)保持为0不变SUBBX,6;应为只统计60分以上成绩SALBX,1;(BX)*2INCS6[BX];S6是S6,S7,S8,S9和S10单元的首地址ADDSI,2LOOPNEXTRETCOUNTENDP;COUNT子程序结束;--------------------------------------------------------------------------CSEGENDS;以上定义代码段;******************************************ENDSTART6.8编写一个有主程序和子程序结构的程序模块。子程序的参数是一个N字节数组的首地址TABLE,数N及字符CHAR。要求在N字节数组中查找字符CHAR,并记录该字符出现的次数。主程序则要求从键盘接收一串字符以建立字节数组TABLE,并逐个显示从键盘输入的每个字符CHAR以及它在TABLE数组中出现的次数。(为简化起见,假设出现次数≤15,可以用16进制形式把它显示出来。)答:程序如下:DSEGSEGMENTTABLEDB255DUP(?)NDW255CHARDB?CHAR_NDB0;用于记录CHAR出现的次数CRLFDB0DH,0AH,‘$’DSEGENDS;以上定义数据段;******************************************STACKSEGMENTDW100DUP(?)TOSLABELWORDSTACKENDS;以上定义堆栈段;******************************************CSEGSEGMENTMAINPROCFARASSUMECS:CSEG,DS:DSEG,SS:STACKSTART:MOVAX,STACKMOVSS,AX;给SS赋值MOVSP,OFFSETTOS;给SP赋值PUSHDS;设置返回DOSSUBAX,AXPUSHAXMOVAX,DSEGMOVDS,AX;给DS赋值BEGIN:MOVBX,0MOVCX,255;最多输入255个字符INPUT:MOVAH,1;从键盘接收一个字符的DOS功能调用INT21HCMPAL,0DH;输入回车符结束输入JZIN_NMOVTABLE[BX],ALINCBXLOOPINPUTIN_N:MOVN,BX;TABLE数组中的字符个数送NCALLDISP_CRLFIN_CHAR:MOVAH,1;从键盘接收一个字符并回显的DOS功能调用INT21HCMPAL,0DH;输入回车符结束JZEXITMOVCHAR,AL;输入的字符存入CHAR单元CALLSEARCH;调搜索字符子程序MOVDL,‘:’;显示“:”,在字符CHAR(输入时回显)的后面MOVAH
本文标题:汇编语言第六章答案
链接地址:https://www.777doc.com/doc-5722194 .html