东华大学微机系统及原理实验报告_第1页
东华大学微机系统及原理实验报告_第2页
东华大学微机系统及原理实验报告_第3页
东华大学微机系统及原理实验报告_第4页
东华大学微机系统及原理实验报告_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-.z.微机系统及应用实验实验报告实验一DEBUG的启动及其基本命令的使用实验内容:6:设堆栈指针SP=2000H,A*=3000H,B*=5000H;请仿照例程的格式编一程序段将A*和B*的内容进行交换。请用堆栈作为两寄存器交换内容的中间存储单元,用DEBUG调试程序进行汇编与调试。写出在DEBUG状态下编写、运行步骤6所要求的程序过程(要求包含源程序)以及调试所中遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。程序清单:STACKSEGMENTSTACKDB2003HDUP(0)STACKENDSCODESEGMENTASSUMECS:CODE,SS:STACKSTART:MOVA*,STACK MOVSS,A* MOVSP,2000H MOVA*,3000H MOVB*,5000H PUSHA* MOVA*,B* POPB* MOVAH,4CH INT21HCODEENDSENDSTART运行及调试:进入调试后,运行正常。进行反汇编调试:通过追踪指令观察SP、A*、B*变化可知对SP、A*、B*赋值正确。将A*入栈后用显示内存单元内容的命令D观察堆栈段中SP为1FFF,2000的内容[1FFF]=00,[2000]=30说明已经A*=3000已经放入到堆栈段中。结果可以看出:A*=5000,B*=3000结果完成正确!实验二内存操作数及寻址方法实验内容:1、设堆栈指针SP=2000H,A*=3000H,B*=5000H;请编一程序段将A*和B*的内容进行交换。请用堆栈作为两寄存器交换内容的中间存储单元,用字处理程序编辑程序,用masm.e*e和link.e*e对源程序进行汇编程和连接,用DEBUG调试程序。2、用masm和link对以下程序进行汇编和连接,调试程序在DEBUG调试程序状态下进行。用单步执行的方法,分析每条指令源地址的形成过程,当数据传送完毕时,A*中的内容是什么。程序清单如下:DATASEGMENTORG0300HADB12H,23H,34H,45H,56H,67H,78H,89H,9AHDATAENDSPROGNAMSEGMENTASSUMECS:PROGNAM,DS:DATASTART:MOVA*,DATAMOVDS,A*MOVA*,B*MOVA*,0300HMOVA*,[0300H]MOVA*,[B*]MOVSI,2MOVA*,0001[B*]MOVA*,[B*][SI]MOVA*,0001[B*][SI]MOVAH,4CHINT21HPROGNAMENDSENDSTART对源程序文件汇编,生成目标文件将目标文件LINK后,生成可执行文件如下:进入debug调试单步追踪执行:A*=0B91,为数据段的首地址。A*不变,将数据段的首地址送至DS。执行MOVA*,B*A*同B*,清零。执行MOVA*,0300HA*=0300执行MOVA*,[0300H]A*=0300可知MOVA*,0300H与MOVA*,[0300H]得到同样结果A*均为0000.将原文中的指令清单改为DATASEGMENTADB12H,23H,34H,45H,56H,67H,78H,89H,9AHORG0300HBDB0BH,0CHDATAENDSPROGNAMSEGMENTASSUMECS:PROGNAM,DS:DATASTART:MOVA*,DATAMOVDS,A*MOVA*,B*MOVA*,0300HMOVA*,[0300H]MOVA*,[B*]MOVSI,2MOVA*,0001[B*]MOVA*,[B*][SI]MOVA*,0001[B*][SI]MOVAH,4CHINT21HPROGNAMENDSENDSTART单步执行后:可知:随着程序进行,A*发生变化。实验三算术运算指令实验内容编写三个完整的汇编语言源程序,完成以下计算。其中*、Y、Z、R、W均为存放16位带符号数单元的地址。(1)Z←W+(Z-*)(2)Z←W-(*+6)-(R+9)(3)Z←(W**)/(Y+6),R←余数实验前要做好充分准备,包括汇编程序清单、调试步骤、调试方法,以及对程序结果的分析等1、程序说明。说明程序的功能、结构。2、调试说明。包括上机调试的情况、上机调试步骤、调试所遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。3、写出源程序清单和执行结果。(1)Z←W+(Z-*)汇编程序清单DATASEGMENT*DW10ZDW20WDW10DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVA*,DATA MOVDS,A* MOVA*,Z SUBA*,* ADDA*,W MOVZ,A* MOVAH,4CH INT21HCODEENDSENDSTART进入debug调试:使用追踪指令T单步执行:执行结果是将20放入A*中。A*=0014H执行结果A*=0014H-000AH=000A,结果正确。执行结果显示:A*=0014H,即为20,正确。然后将结果保存至Z存储字中。最后观察数据组中的数据;显示为*=10,Z=20,W=10。程序运行结果正确(2)Z←W-(*+6)-(R+9)汇编程序清单:DATASEGMENTWDW100*DW20RDW30ZDW"DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVA*,DATA MOVDS,A* MOVA*,W MOVB*,* ADDB*,6 SUBA*,B* MOVB*,R ADDB*,9 SUBA*,B* MOVZ,A* MOVAH,4CH INT21HCODEENDSENDSTART对程序进行汇编后调试:单步执行:此时,对DS的段基址赋值为数据组的首地址此时,对A*B*分别赋值为100,20(3)Z←(W**)/(Y+6),R←余数汇编程序清单:DATASEGMENT*DW10HZDW"WDW10HYDW3HRDW"DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVA*,DATA MOVDS,A* MOVA*,W IMUL* MOVB*,Y ADDB*,6 IDIVB* MOVZ,A* MOVR,D* MOVAH,4CH INT21HCODEENDSENDSTART编译执行结果如下:单步执行结果如下:执行结果可得:商的整数部分z所指向的字单元内容为001CH,余数本分R指向的字单元内容为0004H。实验四查表程序设计实验内容:用查表的方法将一位十六进制数转换成与它相应的ASCII码,并将结果存放到ASCI单元中。汇编程序清单:DATASEGMENTTABLEDB30H,31H,32H,33H,34H,35H,36H,37HDB38H,39H,41H,42H,43H,44H,45H,46HHE*DB0AHASCIDB"DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVA*,DATA MOVDS,A* MOVB*,OFFSETTABLE MOVAL,HE* *LAT MOVASCI,AL MOVAH,4CH INT21HCODEENDSENDSTART对程序进行编译进入debug调试使用t追踪指令观察数据变化ASCI所指向的字节单元的内容正是十六进制数0AH的ASCII值41。实验五系统功能调用实验内容:试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。汇编程序清单:CODESEGMENTASSUMECS:CODESTART:MOVAH,1 INT21H SUBAL,20H MOVDL,AL MOVAH,2 INT21H MOVAH,4CH INT21HCODEENDSENDSTART对源程序编译并进入debug状态调试结果正确。实验六分支程序设计:实验内容假设有一组数据:5,-4,0,3,100,-51,请编一程序,判断:每个数大于0,等于0,还是小于0;并输出其判断结果。即:1当*>0y=0当*=0-1当*<0汇编程序清单:DATASEGMENTTABLEDB5,-4,0,3,100,-51GDB'1',13,10,'$'ZDB'0',13,10,'$'LDB'-1',13,10,'$'DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVA*,DATAMOVDS,A* LEASI,TABLE MOVCL,6COMP:CMPBYTEPTR[SI],0JGGREAT JZEQUAL LEAD*,L JMPSHORTDISPGREAT:LEAD*,G JMPSHORTDISPEQUAL:LEAD*,ZDISP:MOVAH,9INT21H INCSI LOOPCOMP MOVAH,4CH INT21HCODEENDSENDSTART对源程序进行编译并进入调试状态分布调试:从结果可知:经过第一次循环,D*所代表的要输出的字符串的地址0006H即为数据段中Z字符串的EA,所以输出内容为1。且SI自增1,CL减1。以下循环原理同上。全部运行的:程序运行正确。思考题:程序中的原始数据是以怎样的形式存放在数据区中的?请用DEBUG调试程序观察并分析。答:程序中的原始数据是以补码的十六进制的形式存放在数据区中的。实验七循环程序设计实验内容与要求编制程序计算S=1+2·3+3·4+4·5+……+N(N+1)+……直到N(N+1)大于200为止,并将结果由屏幕上显示出来。其程序的流程图如图7.1所示。将从3000H内存单元开始的100个字节存储单元全部清0。本实验要求在DEBUG调试状态下进行,包括汇编程序、运行程序、检查结果。程序框图图7.1程序框图实验步骤实验内容一:1)按程序流程图编制实验程序。2)输入源程序。3)汇编、连接程序,执行程序,检查结果。实验内容二:1)输入源程序并检查无误。2)对内存单元3000H开始的100个存储单元用E命令输入任意数。3)程序的执行可用DEBUG的G命令,也可用T命令单步跟踪执行。4)用D命令检查执行结果。实验内容1的程序清单:DATASEGMENTSTRDB5DUP(0)DB'$'DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVA*,DATA MOVDS,A*MOVD*,1 MOVBL,2LOP:MOVAL,BL INCBL MULBL ADDD*,A* CMPA*,200 JBELOP MOVA*,D*LEADI,STR+4LOP2:MOVCL,10 DIVCL ADDAH,30H MOV[DI],AH ANDA*,00FFH DECDI CMPAL,0 JNELOP2 LEAD*,STR MOVAH,9 INT21H MOVAH,4CH INT21HCODEENDSENDSTART程序运行及结果:程序循环体如下图:结束循环:下部分程序为利用除10取余法将计算结果用十进制在屏幕上显示:计算结果在DS的存储:实验内容与要求将从3000H内存单元开始的100个字节存储单元全部清0。本实验要求在DEBUG调试状态下进行,包括汇编程序、运行程序、检查结果。实验步骤实验内容二:1)输入源程序并检查无误。2)对内存单元3000H开始的100个存储单元用E命令输入任意数。3)程序的执行可用DEBUG的G命令,也可用T命令单步跟踪执行。4)用D命令检查执行结果。汇编程序清单:CODESEGMENTASSUMECS:CODESTART:PUSHDSMOVA*,0 PUSHA* MOVB*,3000HMOVCL,100LOP:MOVBYTEPTR[B*],0 INCB* LOOPLOP MOVAH,4CH INT21HCODEENDSENDSTART运行及调试:E命令修改:T追踪:实验八子程序设计1、程序说明:编制一程序,要求键入一个班的学生成绩,并存放于50字的ERADE数组中,然后根据ERADE中的成绩,把学生名次填入50字的RANK数组中,再按**顺序把名次从终端上显示出来。提示:程序MAIN功能:根据输入的学生成绩,计算并显示出学生名次。子程序INPUT功能:接收一个班级学生的成绩,各成绩之间用空格隔开。子程序RANKP功能:计算一个班级学生的名次。子程序OUTPUT功能:输出(显示)一个班级的学生名次子程序DECIBIN功能:十进制转换二进制,存入B*子程序BINDEC功能:十进制转换二进制,并在屏幕上显示。子程序DEC_DIV功能:B*的内容除以C*的内容,并在屏幕上显示一位商。源程序:DATASEGMENTGRADEDW50DUP()RANKDW50DUP()ENTERDB'Grades:',24H;提示用户输入成绩ERRORDB13,10,'Error!',13,10,24H;用户输入的格式出错SHOWDB'Rank:',24HCOUNTDW0;统计输入的成绩个数CRDB13,10,24h;换行DATAENDSSTACKSEGMENTSTACKDB400DUP(0)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVA*,DATAMOVDS,A*MOVES,A*CALLINPUTCALLRANKPCALLOUTPUTMOVAH,01HINT21HMOVA*,4CHINT21H;INPUT程序段;以**为序从键盘输入一个班的学生成绩,各个成绩之间用逗号格开,最后以回车符结束。;然后把一个班的成绩存入grade数组。INPUTPROCNEARLEAD*,ENTERMOVAH,9INT21H;提示用户输入MOVSI,0MOVCOUNT,0;将输入用户的输入个数置0_ENTER:;对用户的输入进行监视,对错误输入立即进行出错处理CALLDECIBIN;调用DECIBIN;对用户输入进行处理INCCOUNTCMPDL,',';与','比较,相同则保存成绩,不同出错JE_STORECMPDL,0DH;与回车键进行比较,回车则成绩输入结束JE_ENDENTERJNE_ERROR;出错处理:显示出错信息_STORE:;保存成绩MOVGRADE[SI],B*ADDSI,2JMP_ENTER_ERROR:LEAD*,ERRORMOVAH,9INT21H_ENDENTER:;用户结束成绩输入MOVGRADE[SI],B*MOVD*,OFFSETCR;换行MOVAH,9INT21HRETINPUTENDP;RANKP程序段;从grade数组取得一个班的成绩,以**为序计算出该班每个学生的名次存入rank数组。;算法为:一个学生的名次等于成绩高于该生的学生人数加1RANKPPROCNEARMOVDI,COUNTMOVB*,0_LOOP:MOVA*,GRADE[B*];取学生成绩MOVWORDPTRRANK[B*],0;初始化RANK[B*]的值为0MOVC*,COUNTLEASI,GRADE;第一个学生的成绩_NE*T1:CMPA*,[SI];比较两个成绩JG_JUMP;成绩大于被比较的跳过INCWORDPTRRANK[B*]_JUMP:ADDSI,2;取下一个被比较成绩的地址LOOP_NE*T1ADDB*,2;下一个成绩DECDI;未比较成绩个数减1JNE_LOOPRETRANKPENDP;OUTPUT程序段;从rank数组取得一个班的学生名次。把一个班的学生名次以**为序在终端显示出来;调用子模块binidec,以便把rank数组中的二进制数转成十进制数并在终端上显示出来.调用子模块crlf完成回车,换行功能.OUTPUTPROCNEARLEAD*,SHOWMOVAH,09HINT21HMOVSI,0MOVDI,COUNT_NE*T2:MOVB*,RANK[SI];将成绩保存到B*中CALLBINIDEC;调用BINIDECCMPDI,1;将剩余的成绩个数与1比较,若为1则不显示','JE_NOCOMMAMOVDL,','MOVAH,02HINT21H;显示','_NOCOMMA:ADDSI,02H;取下一个成绩名次DECDIJNZ_NE*T2MOVD*,OFFSETCR;换行MOVAH,9INT21HRETOUTPUTENDP;DECIBIN程序段;从键盘取得一个十进制数。把该数转换成二进制数并存入B*寄存器中。DECIBINPROCNEARMOVB*,0_CATCH:MOVAH,01HINT21HMOVDL,ALSUBAL,30HJL_ENDCHANGE;小于则结束SFVOF=1CMPAL,39HJG_ENDCHANGE;大于则结束CBW*CHGA*,B*;A*与B*值交换MOVC*,10MULC*;无符号数乘法指令,(A*)<----(AL)*(C*)*CHGA*,B*ADDB*,A*;(B*)<------(B*)+(A*)JMP_CATCH_ENDCHANGE:RETDECIBINENDP;BINIDEC程序段;把b*寄存器中的二进制数转换成10进制数,并在终端屏幕上显示出来。调用dec_div来作除法运算并显示字符。BINIDECPROCNEARPUSHB*PUSHC*PUSHSIPUSHDI;压栈MOVC*,10CALLDEC_DIV;调用DEC_DIVMOVC*,1CALLDEC_DIV;调用DEC_DIVPOPDIPOPSIPOPC*POPB*;出栈RETBINIDECENDP;DEC_DIV程序段;把b*中二进制数除以相应的十的幂,并在屏幕上显示一位商。余数保存在b*寄存器中。DEC_DIVPROCNEARMOVA*,B*MOVD*,0DIVC*MOVB*,D*MOVDL,ALADDDL,30HMOVAH,02HINT21H;显示RETDEC_DIVENDPCODEENDSENDSTART运行结果:思考题:(1)写出4位BCD码转二进制数的算法。设A*寄存器中存放着4位BCD码BCDTO2PROCNEARPUSHB*PUSHC*PUSHD*MOVB*,A*;保存A*中的BCD码到B*MOVA*,0;结果单元清0MOVC*,4;共处理4位BCD码RETRY:PUSHC* MOVCL,4 ROLB*,CL;最高1位BCD码移到B*中的低半字节 POPC* MULW10;累加和A**10->D*:A* PUSHB* ANDB*,000FH;取出B*中的1位BCD码 ADDA*,B*;累加到A*中 POPB* LOOPRETRY POPD* POPC* POPB* RETBCDTO2ENDP(2)写出A*中进二制数转BCD码的算法。W1000DW1000,100,10,1;十进制数千,百,十,个位权值;入口参数:A*=二进制数。出口参数:A*=压缩BCD码A*2TOBCDPROCNEAR*ORB*,B*;BCD码暂存单元清0MOVSI,OFFSETW1000;权值首地址送SIMOVC*,4;循环次数4->C*RETRY:PUSHC*MOVCL,4SHLB*,CLMOVD*,0;D*:A*组成被除数DIVWORDPTR[SI];除以权值,商,余数在A*,D*中ORB*,A*;压缩BCD码MOVA*,D*;余数送A*POPC*ADDSI,2;地址加2,指向下一权值LOOPRETRYMOVA*,B*;BCD码由B*->A*RETA*2TOBCDENDP实验九综合程序设计实验内容:设有十个学生成绩分别是76,69,84,90,73,88,99,63,100和80分。试编制一个子程序,统计低于60分,60~69分,70~79分,80~89分,90~99分和100分的人数,并输出显示统计结果。编程提示:1、成绩分等部分采用分支结构,统计所有成绩则用循环结构完成,显示统计结果采用DOS功能调用。2、统计学生成绩和显示

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论