北邮微机原理软件实验报告_第1页
北邮微机原理软件实验报告_第2页
北邮微机原理软件实验报告_第3页
北邮微机原理软件实验报告_第4页
北邮微机原理软件实验报告_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

..微机原理软件实验报告实验二分支、循环程序设计一.实验目的1.开始独立进行汇编语言程序设计。2.掌握基本分支,循环程序设计。3.掌握最简单的DOS功能调用。二.实验内容1.安排一个数据区,内存有若干个正数,负数和零。每类数的个数都不超过9。2.编写一个程序统计数据区中正数,负数和零的个数。3.将统计结果在屏幕上显示。三.流程图110开始DS,SS,CX,BX初始化与0相比Z=Z+1BX=BX+2结束数送入AX数送入AXNNB=B+1结果小于0B=B+1结果小于0YYA=A+1A=A+1NNCX=0CX=0YY显示数据显示数据四.源代码DATASEGMENT Z DW 0;数据中0的个数 A DW 0 ;数据中大于0的个数 B DW 0 ;数据中小于0的个数 NUM DW 9,8,0,-7,6,-5,-4,3,2,-1,0,-8,-1,9,0,0,1;设定的一组数据,其中4个0,7个正数,6个负数,符合题目要求 N DW <$-NUM>/2 ;该组数据的个数 TYPE0DB0DH,0AH,'Numberofzeros:$' TYPE1 DB 0DH,0AH,'Numberofgreaterthan0:$' TYPE2 DB 0DH,0AH,'Numberoflessthan0:$' LOCATE DW TYPE0,TYPE1,TYPE2DATAENDSSTACKSEGMENTSTACK DW 128DUP<?>STACKENDSCODESEGMENT ASSUME DS:DATA, SS:STACK, CS:CODESTART:MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX;初始化DS、SS指向STA MOV BX, OFFSETNUM;将NUM中第一个数字的地址送入BX MOV CX, N;将N中数字个数送入CXLOOP1: MOV AX, [BX] ;取出NUM中的第一个数字 CMP AX, 0;与零相比 JZ IFZ ;判断结果为是0,跳转到IFZ处继续执行 SAL AX, 1 JC IFL;判断结果是小于0,跳转到IFL INC WORDPTRA ;否则,A自加,然后继续执行程序 JMP CONTINUEIFL: INC WORDPTRB;B计数加1 JMP CONTINUEIFZ: INC Z ;Z计数加1CONTINUE: ADD BX, 2;指针+2,继续送入下一数字 LOOP LOOP1 ;循环CX次判断 MOV CX, 3;共显示3个字符串 XOR BX, BXDISP: MOV DX, LOCATE[BX] MOV AH, 09H;DOS09号功能调用,显示字符串 INT 21H MOV DX, Z[BX] ADD DX, '0';转换为ASCII码 MOV AH, 02H;DOS02号功能调用,显示字符 INT 21H ADD BX, 2;指针+2〔DW LOOP DISP MOV AX, 4C00H INT 21H;返回DOS系统CODEENDSENDSTART五.运行结果六.预习题1.十进制数0--9所对应的ASCII码是什么?如何将十进制数0--9在屏幕上显示出来?答:0—9的ASCII码值依次为:30H,31H,32H,33H,34H,35H,36H,37H,38H,39H。用待显示数加30H即可得到对应ASCII码,将待显示数的ASCII码值赋给DX,使用"INT21H"02号DOS功能调用显示字符。2.如何检验一个数为正,为负或为零?你能举出多少种不同的方法?答:方法1:用test指令检查该数最高位。若为0,则为正数。否则,检测其余位判断为负数或0。方法2:用cmp指令将该数与0相比,判断标志寄存器。SF⊕OF=0,为正数或0。否则为负数。实验三代码转换程序设计一.实验目的1.掌握几种最基本的代码转换方法。2.运用子程序进行程序设计。二.实验内容1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来。2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明。3.对输入要有检错措施,以防止非法字符输入,并有适当的提示。4.将整个程序分解为若干模块,分别用子程序实现.在报告中要给出模块层次图。三.模块层次图及流程图STARTSTART排序,显示输入数据排序,显示输入数据显示排序十进制转换存储并显示检错显示排序十进制转换存储并显示检错开始开始输入数据输入数据错检错错检错N对N对Y回车Y回车B,BX,AL初始化B,BX,AL初始化AL中ASCII码值转换为对应十进制数AL中ASCII码值转换为对应十进制数此数赋值给B小于此数赋值给B小于BX指向的BX指向的数与B比较大于大于BX=BX+1BX=BX+1N比较结束N比较结束YY输出最小数输出最小数结束结束四.源代码DATASEGMENTADB100DUP<0>BDB100,0,'$'STRINGDB0DH,0AH,'ERRORINPUT',0DH,0AH,'$'STRING1DB0DH,0AH,'theminnumberis',0DH,0AH,'$'DATAENDSSTACKSEGMENTSTACK DW50DUP<?>STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKINPUTPROC;子程序PUSHAX;保护寄存器内容PUSHBX;保护寄存器内容PUSHCX;保护寄存器内容PUSHDX;保护寄存器内容STAR:MOVCX,0;开始,表示输入的数是否可以构成两位十进制数MOVBX,OFFSETAAGAIN:MOVAH,01H;输入INT21HCMPAL,30H;比较是否合法SHOWCMPAL,39HJASHOWMOV[BX],AL;存储,判断是否一个字,不是继续输入,否则向下运行INCBXINCCXANDCX,1JNZAGAIN;CX若为0,输入了两个数,可以构成一个两位十进制数MOVCX,0;判断下一输入字符MOVAH,01H;输入INT21HMOV[BX],ALINCBXCMPAL,20H;判断是否空格:是,继续输入;否,判断是否为回车JZAGAINCMPAL,0DH;判断是否为回车JNZSHOW;都不是,就输入错误,重新输入JMPOKEY;是回车,就输入结束。否则结束子程序调用SHOW:MOVAH,09H;不合法显示错误重新输入MOVDX,OFFSETSTRINGINT21HJMPSTAROKEY:MOV[BX],AL;输入结束POPDXPOPCXPOPBXPOPAXRETINPUTENDPCHANGEPROCPUSHAXPUSHBXPUSHDXMOVBX,OFFSETAONCE:MOVAL,[BX];读数SUBAL,30H;转化为16进制数INCBXMOVDL,10;转化为16进制数MULDLMOVDH,[BX]SUBDH,30HINCBXADDAL,DH;结果CMPAL,B;比较哪个最小YESCMPBYTEPTR[BX],0DH;判断是否是回车JZLASTJMPONCEYES:MOVB,AL;最小数存于BCMPBYTEPTR[BX],0DHJZLASTINCBXJMPONCELAST:NOPMOVAL,B;将数的个位和十位分别存储AH存个位AL存十位MOVAH,0MOVDL,10DIVDLADDAH,30H;转换为ASCII码ADDAL,30HMOVB,AL;存到内存中MOVB+1,AHPOPDX;pop出原保存的寄存器数据POPBXPOPAXRETCHANGEENDPSTARTPROCFAR;主程序MOVAX,DATAMOVDS,AXCALLINPUT;调用输入子程序MOVAH,09HMOVDX,OFFSETSTRING1;显示提示性语句INT21HCALLCHANGE;调用比较子程序MOVAH,09HMOVDX,OFFSETB;显示最小数INT21HMOVAX,4C00HINT21HSTARTENDPCODEENDSENDSTART五.运行结果六.预习题1.如何将输入的两个字符<0--9>变为十进制或二进制数?答:将数的ASCII码值减去30H,即可得到对应的十进制数。2.如何将选出的最小值<二进制或十进制>变为ASCII码再进行显示?答:用DB定义一个字节型数据存放十进制数〔高四位表示十位,低四位表示个位。使用cmp指令,先比较高四位,若小于,则和已存的数交换;若等于,则继续比较低四位,小于则交换。若等于,数不变。3.你觉得采用二进制运算还是十进制运算更适合于这个实验?答:十进制更合适。实验四子程序设计一.实验目的1.进一步掌握子程序设计方法。2.进一步掌握基本的DOS功能调用。二.实验内容1.从键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入2.统计检查每个学生的名次。3.将统计结果在屏幕上显示。4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜.输出应便于阅读.尽可能考虑美观。5.输入要有检错手段。三.流程图检错检错开始初始化界面输入成绩falsefalsetruetrue调用排序子程序调用排序子程序显示结果显示结果结束结束四.源代码DATASEGMENTBUFFERDB100DB?DB10DUP<?>STR1DB'pleaseinputthescoreofthestudents:',0DH,0AH,'$'STR2DB'error,pleaseinputthescoreagain:',0DH,0AH,'$'STR3DB'numrankscor',0DH,0AH,'$';提示语句的字符串VAR1DW?VAR2DW?CKDB?TABDB100DUP<?>DATAENDSSTACKSEGMENTSTACK'stack'DB100DUP<'s'>STACKENDSCODESEGMENTPARA'code'ASSUMECS:CODE,DS:DATA,SS:STACKSTARTPROCFARPUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AX;初始化DSLEADX,STR1MOVAH,09H;调用DOS09号功能显示字符串STR1INT21HINPUT:LEADX,BUFFERMOVAH,0AH;调用DOS0A号功能,从键盘输入字符串并存储INT21HLEADI,TABXORCX,CXMOVAH,30HMOVDH,31HLEABX,BUFFER+2CALLCHECK;调用检错子程序CMPCK,1JZINPUTCALLCOM;调用排序子程序MOVDL,0DHMOVAH,02H;调用DOS02号功能,显示DL字符INT21HMOVDL,0AHMOVAH,02HINT21HLEADX,STR3;调用DOS09号功能,显示字符串STR3MOVAH,09HINT21HCALLDISPY;调用送显程序RETSTARTENDPCHECKPROC;检验子程序NEXT1:MOVCK,0MOV[DI],AHINCDIMOV[DI],DHINCDICMPDH,39HJZL1INCDHJMPL2L1:MOVDH,30HINCAHL2:MOVAL,[BX]CMPAL,30HERRORCMPAL,39HJAERRORMOV[DI],ALINCDIINCBXMOVAL,[BX]CMPAL,30HERRORCMPAL,39HJAERRORMOV[DI],ALINCDIINCBXINCCXMOVAL,[BX]CMPAL,0DHJZFINISH1INCBXJMPNEXT1ERROR:LEADX,STR2;调用DOS09号功能,显示字符串STR2MOVAH,9INT21HMOVCK,1FINISH1:RETCHECKENDPCOMPROC;调用排序子程序COMP1:PUSHCXMOVVAR1,CXSHLCX,1SHLCX,1SUBCX,4MOVVAR2,CXPOPCXDECDIDECDIJMPCOTICOMP2:ADDDI,VAR2COTI:MOVBL,0MOVCX,VAR1DECCXAGAN:MOVAL,[DI]CMPAL,[DI-4]JAGOON1GOON3INCDIMOVAL,[DI]CMPAL,[DI-4]PUSHFDECDIPOPFJAGOON1EGOON3GOON1:MOVBL,-1PUSHCXMOVCX,4DECDIDECDIGOON2:MOVAL,[DI]XCHGAL,[DI-4]MOV[DI],ALINCDILOOPGOON2POPCXDECDIDECDIGOON3:DECDIDECDIDECDIDECDILOOPAGANCMPBL,0JNZCOMP2DECDIDECDIMOVCX,VAR1MOVBH,30HMOVBL,31HRETCOMENDPDISPYPROC;送显子程序DISPY1:MOVDL,BHMOVAH,02H;调用DOS02号功能,显示DL字符<学号>INT21HMOVDL,BLMOVAH,02HINT21HMOVDL,'';调用DOS02号功能,显示DL字符<空格>MOVAH,02HINT21HINT21HINT21HMOVDL,[DI]MOVAH,02H;调用DOS02号功能,显示DL字符<排名>INT21HINCDIMOVDL,[DI]MOVAH,02HINT21HINCDIMOVDL,''MOVAH,02H;调用DOS02号功能,显示DL字符<空格>INT21HINT21HINT21HMOVDL,[DI]MOVAH,02HINT21HINCDIMOVDL,[DI]MOVAH,02H;调用DOS02号功能,显示DL字符<成绩>INT21HINCDIMOVDL,0DHMOVAH,02HINT21HMOVDL,0AHMOVAH,02HINT21HCMPBL,39HJZL3INCBLJMPNEXT2L3:MOVBL,30HINCBHNEXT2:LOOPDISPY1;循环显示RETDISPYENDPCODEENDSENDSTART五.运行结果六.预习题1.如何确定一个学生在这门科目中的名次?答:将学生成绩按照学号依次存放在一个数据区内,设BX为指针指向首地址,使用数据结构中的排序算法进行比较〔比如冒泡排序法。2.你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单?答:使用排序算法,通过指针排序好成绩后,其对应的学号也相应排好。3.准备好模块层次图.StartStartINPUT输入CHECK检错DISPY显示COM排序INPUT输入CHECK检错DISPY显示COM排序4.给出输出显示的形式.Num,rank,scor分别表示学生的学号,排名和分数。实验五子程序设计实验目的1.初步掌握中断程序的设计方法。2.初步掌握修改DOS系统中断,以适应实际使用的方法。实验内容1.编写一个32位二进制数除以16位二进制数的除法程序.观察当除数为0,或超过相应寄存器范围时,程序执行的结果。2.修改零号中断服务程序,使它具有以下功能:<1>判断除数是否为0,当除数为0时,显示相应的结果。<2>当除数不为0时,采用适当的方法完成商超过16位的二进制数的除法运算。3.注意必须保护原有中断服务程序的入口地址,并在程序完毕前加以恢复。三.流程图检错检错开始初始化界面输入除数,被除数修改0号中断向量表修改0号中断向量表falsefalsetruetrue除法除法Y溢出Y溢出N除数为0NN除数为0NY32位扩展输出结果Y32位扩展输出结果恢复0号中断向量表恢复0号中断向量表结束结束四.源代码DATASEGMENT messagedb0AH,0DH,'divisorequals0.',0dh,0ah,'$' message1DB0AH,0DH,'inputerror',0DH,0AH,'$'message2DB'PLEASEINPUTTHEDIVIDEND<32>',0AH,0DH,'$'message3DB0AH,0DH,'PLEASEINPUTTHEDIVISOR<16>',0AH,0DH,'$'message4DB0AH,0DH,'THEQUOTIENTIS:','$'message5DB0AH,0DH,'THEREMAINDERIS:','$' DATAENDSSTACKSEGMENTSTACK'STACK' STACKENDSCODESEGMENT ;代码段 ASSUMECS:CODE,SS:STACK,DS:DATAstart procfar pushds movax,0 pushax movax,data movds,ax sti ;TF中断标志置1 moval,0 ;保存原中断向量 movah,35h int21h pushes pushbx pushdx ;写中断向量 movax,segint00 movds,ax movdx,offsetint00 moval,0 movah,25h int21h popds movah,09h movdx,segmessage2 ;提示输入32位二进制0或1 movds,dx movdx,offsetmessage2 int21h movcx,10h movax,0000h pushax a1: movah,01h int21h cmpal,'0' ;输入数字与0比较 jza2 cmpal,'1' ;输入数字与1比较 jnzerror1 ;输入有误则跳错误显示程序 stc ;为1则将CF置1 rcldx,1 ;dx左移,移进一个1 loopa1 jmpa3a2: clc ;为0则将CF置0 rcldx,1 ;dx左移,移进一个0 loopa1a3: movcx,10ha4: movah,01h int21h cmpal,'0' jza5 cmpal,'1' jnzerror2 stc popax rclax,1 pushax loopa4 jmpa6a5: popax clc rclax,1 pushax loopa4a6: movah,09h movdx,segmessage3 ;提示输入16位0或1除数 movds,dx movdx,offs

温馨提示

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

评论

0/150

提交评论