《计算机原理及汇编语言》课程设计报告

上传人:第*** 文档编号:61574947 上传时间:2018-12-04 格式:PDF 页数:27 大小:541.76KB
返回 下载 相关 举报
《计算机原理及汇编语言》课程设计报告_第1页
第1页 / 共27页
《计算机原理及汇编语言》课程设计报告_第2页
第2页 / 共27页
《计算机原理及汇编语言》课程设计报告_第3页
第3页 / 共27页
《计算机原理及汇编语言》课程设计报告_第4页
第4页 / 共27页
《计算机原理及汇编语言》课程设计报告_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《《计算机原理及汇编语言》课程设计报告》由会员分享,可在线阅读,更多相关《《计算机原理及汇编语言》课程设计报告(27页珍藏版)》请在金锄头文库上搜索。

1、中南大学 计算机原理与汇编语言 课程设计报告 目录目录: 一实验一:使用子程序,计算出 1000 以内的素数,以十进制形式输出。 1、需求分析 2、总体设计 3、详细设计 4、调试分析 5、测试结果 6、附录:带注释的源程序。 二实验二:计算 50 以内 Fibonacci 数,以十进制形式输出。 1、需求分析 2、总体设计 3、详细设计 4、调试分析 5、测试结果 6、附录:带注释的源程序。 三实验三:从键盘输入年份,通过计算后,输出该年份是否为闰年的信息。 1、需求分析 2、总体设计 3、详细设计 4、调试分析 5、测试结果 6、附录:带注释的源程序。 四实验四:反向输出一个整数 1、需求

2、分析 2、总体设计 3、详细设计 4、调试分析 5、测试结果 6、附录:带注释的源程序。 五课程设计总结 六参考文献 一实验一一实验一 使用子程序使用子程序,计算出计算出 1000 以内的素数以内的素数,以十进以十进 制形式输出。制形式输出。 1、需求分析 程序的功能:以十进制形式输出 1000 以内的素数 变量以及数组需求:需要一个变量 count 来计数,以便于素数的输出;需要一个数组 sushu 来存放计算过程中得到的素数 寄存器需求: 在汇编里面, 除法运算只能是 16 位除以 8 位或者 32 位除以 16 位, 1000 比 255 大,因此要用 32 位除以 16,要用 dx,a

3、x 来存放除数,bx 存放被除数 2、总体设计 3、详细设计 求素数的算法 计算素数并储存 将求得素数以 十进制输出 程序开始 程序结束 素数的约数只有 1 和本身 bool isPrime(int n) if(n =3 变量及数组需求:两个变量 x1,x2,用于代替 FIB(N-2) ,FIB(N-1) ,并初始化为 1 一个数组 FN ,用来存储 Fibonacci 数 2、总体设计 程序 开始 Ax=x1+x2Ax50? 3、详细设计 算法描述: function fibonacci(n) if(n = 1 | n =2) return 1; else return fibonacci(

4、n-1) + fibonacci(n-2); 主要程序: X1=x2 X2=AX 结束 输出 Fibonacci 数 n Y 利用堆栈,实现 x1,x2 的互换,不断累加,求下一个 Fibonacci 数 PUSH X1 PUSH X2 S: MOV AX,X1 ADD AX,X2 MOV FNBX,AX ;ax 中的数存在了数组 FN中 PUSH X2;上一个 x2 变成下一个 x1 POP X1 MOV X2,AX;上一个 ax 变成下一个 x2 ADD BX,2 cmp AX,50 jl S POP X2;原始的 x2=1 POP X1;原始的 x1=1 求出 Fibonacci 数后,

5、以十进制数输出 DISP: MOV AX,SI MOV DX,0 MOV BX,10 DIV BX PUSH DX ADD AL,30H MOV DL,AL MOV AH,02H INT 21H POP DX ADD DL,30H MOV AH,2 INT 21H RET 4、调试分析 错误原因:没有将数字转化为字符输出 5、测试结果 6、附录:带注释的源程序。 DATA SEGMENT X1 DW 1 X2 DW 1 FN DW 25 DUP(?) BUF DB 0DH,0AH,The fibonacci below 50 are:$ DATA ENDS CODE SEGMENT ASSUM

6、E DS:DATA,CS:CODE START: MOV AX,DATA MOV DS,AX LEA DX,BUF;输出提示信息 MOV AH,9 INT 21H MOV AH,02H MOV DX,0DH INT 21H MOV DX,0AH MOV AH,2 INT 21H MOV BX,0 PUSH X1 PUSH X2 S: MOV AX,X1 ADD AX,X2 MOV FNBX,AX ;ax中的数存在了数组FN中 PUSH X2;上一个x2变成下一个x1 POP X1 MOV X2,AX;上一个ax变成下一个x2 ADD BX,2 cmp AX,50 jl S POP X2;原始的

7、x2=1 POP X1;原始的x1=1 LEA SI,X1 ADD BX,2 MOV CX,BX;通过BX来控制输出,即保证输出的数在50以内 S1: CALL DISP;显示一个其中的数 ADD SI,2 MOV AH,02H;输出后面的DL中的内容(即空格) MOV DL,20H;显示三个空格 INT 21H MOV DL,20H INT 21H MOV DL,20H INT 21H sub CX,1 LOOP S1;循环(再一次读DISP,ADD SI 2) MOV AX,4C00H;结束标志 INT 21H DISP: MOV AX,SI MOV DX,0 MOV BX,10 DIV

8、BX PUSH DX ADD AL,30H MOV DL,AL MOV AH,02H INT 21H POP DX ADD DL,30H MOV AH,2 INT 21H RET CODE ENDS END START 三实验三三实验三 从键盘输入年份从键盘输入年份,通过计算后通过计算后,输出该年份是否为闰年输出该年份是否为闰年 的信息的信息 1、需求分析 变量需求:需要一段缓存空间 buf 来保存从该键盘键入的字符 需要一个变量 year 来保存转化为数字后的年份 需要一个判断是否是闰年的标志 flag 2、总体设计 程序开始 键入年份 存入 buf 将 buf 里的字 符转换为数字 YN

9、3、详细设计 C 语言算法描述: void main() int year,leap; scanf(“%d“, if(year%4=0 else leap=0; if (leap) printf(“%d is a leap!n“, else 判断 year 是否是闰 年 输出: 是闰年 输出: 不是闰 年 程序结束 printf(“%d is not a leap!n“, 主要程序段: char_to_num proc near;把表示年份的字符串转换为数值 push cx dec cx lea di,buf+2 l1: inc di;使 di 指向最后一个字符 loop l1 pop cx

10、mov ax,1 l2: push ax mov dh,30h mov bx,10 mov dl,di;字符减去30H后即可转换为十六进 制数 sub dl,dh mov dh,0 muldx add year,ax pop ax mul bx dec di;di 依次向前一个字符移动 loop l2 ret char_to_num endp ifyears proc near ;判断是否是闰年 movax,year movdx,0 movbx,100 divbx cmpdx,0 jenext mov dx ,0 movax,year movbx,4 divbx cmpdx,0 jeflag2

11、 jmp flag1 next: mov dx,0 movax,year movbx,400 divbx cmpdx,0 jeflag2 jmp flag1 flag1:mov flag,0 ret flag2: mov flag,1 ret ifyears endp 4、调试分析 5、测试结果 6、附录:带注释的源程序。 data segment information db 0dh,0ah,Please input a year: $ yes db 0dh,0ah,This is a leap year! $ no db 0dh,0ah,This is not a leap year! $

12、 year dw 0;用于保存输入的年份的数值 buf db 8 db ? db 8 dup(?) flag db 0 ;判断标志 data ends stack segment stack db 200 dup(0) stack ends code segment assume ds:data,ss:stack,cs:code start:mov ax,data mov ds,ax lea dx,information;在屏幕上显示提示信息 mov ah,9;显示字符串 int 21h lea dx,buf;从键盘输入年份字符串 mov ah,0Ah;0AH功能调用从键盘接受字符串到内存的输

13、入缓存 区 int 21h mov ch,0 ;ch要清0,否则循环次数有误. mov cl, buf+1 ;把输入的字符的个数保存在cl中 call char_to_num ;调用char_to_num子程序 call ifyears;调用ifyears子程序 cmp flag,0 jne l3 lea dx,no mov ah,9 int 21h jmp exit L3:lea dx,yes mov ah,9 int 21h exit:MOV AH,4CH INT 21H char_to_num proc near;把表示年份的字符串转换为数值 push cx dec cx lea di,

14、buf+2 l1: inc di;使di指向最后一个字符 loop l1 pop cx mov ax,1 l2: push ax mov dh,30h mov bx,10 mov dl,di;字符减去30H后即可转换为十六进制数 sub dl,dh mov dh,0 muldx add year,ax pop ax mul bx dec di;di依次向前一个字符移动 loop l2 ret char_to_num endp ifyears proc near movax,year movdx,0 movbx,100 divbx cmpdx,0 jenext mov dx ,0 movax,y

15、ear movbx,4 divbx cmpdx,0 jeflag2 jmp flag1 next: mov dx,0 movax,year movbx,400 divbx cmpdx,0 jeflag2 jmp flag1 flag1:mov flag,0 ret flag2: mov flag,1 ret ifyears endp code ends end start 四实验四四实验四 反向输出一个整数反向输出一个整数 1、需求分析 变量需求:需要一个数组来存放反序的数 2、总体设计 3、详细设计 Str1 Str2 MOV CX,len AGAIN:;依次将 str1 中的数字按相反的顺

16、序放在 str2 中 MOV Al,DI MOV SI,Al dec SI inc DI 程序开始 将整数反 序并输出 程序结束 12345 LOOP AGAIN 4、调试分析 错误原因:缺少字符串终止符$ 5、测试结果 原整数为:12345 运行程序后,结果如下: 6、附录:带注释的源程序。 DATAS SEGMENT ;此处输入数据段代码 str1 db 12345,$ len equ 5 str2 db len+1 dup($) DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX ;此处输入代码段代码 MOV DI,OFFSET str1 MOV SI,OFFSET str2+len-1 MOV CX,len AGAIN:;依次将str1中

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号