中南大学 计算机原理与汇编课程设计报告.docx
计算机原理与汇编课程设计报告贺建飕姓名: 学号: 班级: 指导老师:LEA DX,fwe MOV AH,9 INT21H JMP exit;不成功,显示错误信息,关闭文件,并结束程序cmpcx:CMP CX,512JE readf LEA DX,fcs MOV AH,9 INT21H exit:;判断实际读入的字数是不是512;如果是512,说明还没读到文件尾;显示复制成功MOV AH,3EHINT21HMOV BX,fnum_sMOV AH,3EHINT21HMOV AX,4C00HINT21H;关闭文件codeENDENDSstart程序运行结果:情况一:源文件不存在国 DOSBox 0.74f Cpu speed: 3000 cycles, Frameskip 0, Program:Please input the path and name of source file:C:ABC.TXTFile has not existed!情况二:目标文件已存在H DOSBox 0.74f Cpu speed: 3000 cycles, Frameskip 0, PrograrrPlease input the path and name of source file:C:AAA.TXTPlease input the path and name of source file:C:CCC.TXTObject file has existed?情况三:复制成功回 DOSBox 0.74, Cpu speed: 3000 cycles, Frameskip 0f Program: TEMPF.Please input the path and name of source file:C:AAA.TXTPlease input the path and name of object file:C:BBB.TXTFile copyed succeed.目标文件夹文件情况:计算机 , Windows8_OS (C:) 名称,BBB修改日期力2014/7/5 14:12大小1 KB冒AAA2014/7/5 14:121 KB1o CCC2014/7/5 14:100 KB六、总结在进行循环程序设计时,要注意循环初始化、内外层循环的控制、循环结束条件等的设 置,对整个程序的执行逻辑要非常清楚,这样可以避免死循环等意外情况的出现。多层循环 的控制更为复杂,编写代码时,要注意注释重要的循环控制部分,这样思路才不会乱。同时 要对照流程图,随时观察代码的逻辑思路是否正确。在程序的制作过程中,遇到了很多意想不到的困难,自己一个人解决起来有很大的困难, 于是也少不了同学的帮助,深刻体会到开发程序不只是一两个人就能很好地完成的,要大家 互相帮助,共同探讨问题,才能更好的解决困难。汇编语言课程设计一、设计目的:课程设计是计算机原理与汇编语言教学过程中的重要环节。本课程设计主要目的是使计 算机专业学生深入学习计算机原理与汇编语言知识,进一步提高学生计算机原理与汇编语言 综合能力和程序设计技能,锻炼运用计算机原理与汇编语言解决实际问题的能力。二、设计要求:1 .认真查阅资料,独立完成设计任务,每道题都必须上机通过。2 .独立思考,培养综合分析问题解决问题和调试程序的能力。3 .按时完成课程设计,写出课程设计报告。三、设计内容及原理设计内容:1 .使用到子程序100以内的素数,以十进制形式输出。2 .用递归计算50以内Fibonacci数,以十进制形式输出。3 .编写一拷贝程序,要求在命令行指定源文件名和目标文件名。设计原理:1 .结合几种含有特定功能的子程序以完成设计要求。2 .建立循环程序递归计算Fibonacci数。3 .根据输入判断文件是否存在并执行拷贝过程。四、设计思路1 .使用到子程序100以内的素数,以十进制形式输出。按照设计要求,可以建立3个子程序,一个判断素数子程序,一个显示素数子程序,一 个将素数以十进制形式输出子程序,然后在主程序中调用子程序,程序框架得以构建。2 .用递归计算50以内Fibonacci数,以十进制形式输出。按照设计要求,可以建立循环子程序,递归计算Fibonacci数,以十进制形式输出,再 将新Fibonacci数与50比较,大于50则退出循环,程序结束.3 .编写一拷贝程序,要求在命令行指定源文件名和目标文件名。在数据段中编写各种提示语句,在代码段中加入各种判断语句及中断跳转语句,程序运 行时,即可根据命令行输入的指定源文件名和目标文件名执行相应的功能。五、实现步骤1.使用到子程序100以内的素数,以十进制形式输出。程序代码如下:DATAS SEGMENTcount dw 0;存放素数的个数sushu db 100 dup(?);存放素数msgsushu db 'all prime numbers below 100 are:;$;显示素数的提示信息msgcount db 0dh,0ah,'count of prime numbers is:',0dh,0ah,$;2K示素数个数的提示信息 DATAS ENDSCODE SEGMENTassume cs:CODE, ds:DATASMAIN PROC FAR ;主程序入口call jisuanlea dx,msgsushu;显示素数的提示信息mov ah,9int 21hcall dispsushu;显示素数lea dx,msgcount;显示素数个数的提示信息mov ah,9int21hcall dispcount;显示素数个数mov ah, 1;按任意键退出int 21 hmov ax, 4c00h ;程序结束,返回到操作系统系统int21hMAIN ENDPjisuan proc nearmov ax, datasmov ds, axlea di,sushumov bh,0mov bl,2;求从2到100的素数、素数个数,BL从2到100变化nextll:cmp bl, 100jatjmov dl,2;如果BL不能被DL从2到BL-1整除的话,则BL为素数next 12:cmp dl,bljae nextl3mov ax,bxdiv dlcmp ah,0jz nextl4;整除则不是素数inc dljmp next 12next 13:inc count;是素数,贝1J将个数力口1mov di,bl;是素数,则存入相应单元中inc dinext 14:inc bljmp next 11tj:retjisuan endpdispsushu proc nearlea si,sushumov ex,countnext21:mov ax,count;每行10个素数sub ax,exmov bl, 10div blcmp ah,0jnz next22mov dl,Odh;每行10个素数,行末加回车换行mov ah,2int21hmov dl,Oahmov ah,2int 21hnext22:mov取出一个素数mov bh,0call displO;以十进制形式输出mov dl,20h;每个素数之间加一个空格,便于区分mov ah,2int21hinc siloop next21retdispsushu endpdispcount proc nearmov bx,count;取出素数个数call displO;以十进制形式输出retdispcount endpdisplO proc near;该子程序的作用是将BX中的数以十进制形式输出 push exmov cx,10dcall dec_divmov ex,Idcall dec_divpop exretdec_div proc nearmov ax,bxmov dx,0div exmov bx,dxmov dl,aladd dl,3Ohmov ah,2int21hretdec_div endpdisplO endpCODE ENDSEND MAIN程序运行结果:DOS BOXDOSBox 0.74r Cpu speed: 3000 cycles. Frameskip 0, Pnall prime numbers belou 100 are:OZ 03 31 3773 79 countZ5054183 of07 1143 4789 97prime13 17 19 Z353 59 61 67numbers is:Press any key2971to continue2.用递归计算50以内Fibonacci数,以十进制形式输出。程序代码如下:ASSUME CS:CODES, DS:DATASDATAS SEGMENTM2 DB 13, 10, 'Fibonacci numbers which below 50 are: $'N1 DW 0N2 DW 1DATAS ENDSCODES SEGMENTSTART:MOV AX, DATASMOV DS, AXLEA DX, M2MOV AH, 9INT 21HMOV DL/TMOV AH, 2INT 21HMOV DLJINT 21HLP:MOV AX, N1ADD AX, N2MOV BX, N2MOV N1,BXMOV N2, AXCMP N2,50JA EXITCALL OUTPUTMOV DL, 一MOV AH, 2INT 21HCMP N2,50JNA LPEXIT:MOV AH, 4CHINT 21H;返回 DOSOUTPUT:BX, 10CX,0DX,0BXDL, 'O'DXCXAX,0MOVMOVOL1:MOV DIV ADD PUSHINC CMPJNZ OLIMOV AH, 2OL2:POP DXINT 21HJA EXITLOOP OL2RETCODES ENDSEND START程序运行结果:DOS FOXDOSBox 0.74f Cpu speed: 3000 cycles, Frameskip 0, Program:ibonacci numbers which belou 50 are: 1 1 Z 3 5 8 13 Z1 34Press any key to continue3.编写一拷贝程序,要求在命令行指定源文件名和目标文件名。程序代码如下:dataSEGMENTmesslDBPlease input the path and name of source file:0DH,0AH,24Hmess2DBODHQAH,Please input the path and name of object file:1,07H,0DH,0AH,24HfnfDB0DH,0AH;File has not existed!',07H,0DH,0AH,24HfdfDBODHQAH,'Object file has existed! ;07H,0DH,0AH,24HfdeDBODH,OAH;Object path has not existed!',07H,0DH,0AH,24HfreDB0DH,0AH,'Reading error.1,07H,0DH,0AH,24HfweDB0DH,0AH;Writting error/,07H,0DH,0AH,24HfcsDB0DH,0AH;File copyed succeed.,0DH,0AH,24HfbufferDB128DB9fnameDB128 DUP (?)fnum_sDW9 *fnum_dDW9 *bufferDB512 DUP (?)dataENDScode SEGMENTASSUME CS:code,DS:data start: MOV AX,dataMOV DS,AXPUSH DSPOP ESfullO:LEA DX,messlMOV AH,9INT21HCLDMOV CX,128MOV AL,0LEA DI,fnameREP STOSBLEA DX,ftufferMOV AH,0AHINT21HMOV BL,fbuffer+l;将输入文件名的最后一个回车符换成0,因为建立的文件名不能包 括不可见字符XOR BH,BHMOV SI,OFFSET fnameADD SI,BXMOV BYTE PTR SI,0LEA DX,fnameMOV AX,3D00HINT21HJNC open;打开成功LEA DX,fnfMOV AH,9INT21HJMP fullO;重新输入open:MOV fnum_s,AX;打开成功,保存源文件号fulll:LEA DX,mess2MOV AH,9INT21HCLD ;充0,将上次输入的文件名清零MOV CX, 128 ;文件名最大128字符,包括回车符MOV AL,0LEA DI,fnameREPSTOSBLEA DX,fbuffer;输入文件名MOV AH,0AH;键盘输入到缓冲区 DS:DX=缓冲区首地址INT21HMOV BL,fbuffer+lXOR BH,BHMOV SI,OFFSET fnameADD SI,BXMOV BYTE PTR SI,0LEA DX,fnameMOV AX,3D00HINT21HJC setup;打开不成功LEA DX,fdfMOV AH,91NT21HJMP exitsetup: LEA DX,fnameMOV AH,3CH;建立新文件INT21HJNC save ;建立成功LEA DX,fdeMOV AH,9INT21HJMP exitsave: MOV fnum_d,AX;保存新文件号MOVAX,3D01H;以只写方式打开新文件INT21Hreadf:MOV BX,fnum_s ;取源文件号MOV CX,512;读出512个字符MOV DX,OFFSET bufferMOV AH,3FHINT21HJNC writef ;读成功,则写LEADX,fre ;不成功,显示错误信息,关闭文件,并结束程序MOVAH,9INT21HJMP exitwritef:MOV BX,fnum_d ;取新文件号MOV CX,AX;按实际读入字数写文件MOV AH,40HINT21HJNC empex ;写成功