计算机组成原理与汇
编课程设计
实验报告
学 院: 信息科学与工程学院
专业班级: 信息安全1301班
指导老师: 何小贤
学 号: 0906130119
姓 名: 田泽佳
目录
一、课程设计目标………………………………………………………3
二、课程设计基本要求…………………………………………………3
三、课程设计的内容……………………………………………………3
四、课程设计的要求……………………………………………………5
五、实验详细设计………………………………………………………5
1. 统计文件中各字母出现的频率…………………………5
2. 用递归计算50以内Fibonacci 数, 以十进制数输出…9
3.虚拟平台模拟机实验……………………………………11
六、使用说明…………………………………………………………19
七、总结与心得体会……………………………………………………19
八、参考文献…………………………………………………………20
九、附录………………………………………………………………20
1. 字符统计.asm……………………………………………20
2. 斐波那契数(小于50).asm………………………………29
- 2 -
一、 课程设计目标
通过课程设计使学生综合运用所学过的计算机原理与汇编知识,增强解决实际问题的能力,加深对所学知识的理解与掌握,提高软硬件开发水平,为今后打下基础。
课程设计的目的和要求:
1、使学生巩固和加强《计算机原理与汇编语言》课程的基本理论知识。
2、使学生掌握汇编语言程序设计的方法及编程技巧,正确编写程序。
3、使学生养成良好的编程习惯并掌握调试程序的基本方法。
4、使学生养成规范书写报告文档的能力,撰写课程设计总结报告。
5、通过查阅手册和文献资料,培养学生独立分析问题和解决问题的能力。
二、课程设计的基本要求
1、认真查阅资料,独立完成设计任务,每道题都必须上机通过。
2、编写预习报告,写好代码,上机调试。
3、独立思考,培养综合分析问题解决问题和调试程序的能力。
4、按时完成课程设计,写出课程设计报告。
三、课程设计的内容
1、给定一个英文ASCII码文件,统计文件中英文字母的频率,以十进制形式输出。
2、用递归计算50以内Fibonacci 数, 以十进制数输出.
3、虚拟平台的模型机实验,具体要求如下:
1) 选择实验设备,将所需要的组件从组件列表中拖到实验设计流程栏中
2) 搭建实验流程:根据原理图1和电路图(见附件),将已选择的组件进行连线。
3) 输入机器指令:选择菜单中的“工具”,再选择“模型机调试”,在指令输入窗口中输入如下指令:
00000000
00010000
00001001
00100000
00001011
00110000
- 3 -
00001011 01000000 00000000 00000001
本实验设计机器指令程序如下:
4) 这里做的是个加法运算,第一个加数已经存入到内存的0000 1010单元
中,第二个加数是需要手工输入的。在实验运行面板中点击“运行”按钮,选择“输入”芯片,设置输入的数据后,双击连接“输入”芯片的单脉冲,这样第二个加数就设置好了。
5) 在实验运行面板中双击连续脉冲,模型机便开始工作,观察各个芯片的状
态。或者在模型机调试窗口中(如图2所示)点击“指令执行”选项卡,在模型机调试窗口中点击“下一时钟”,模型机机执行到下一个时钟,点击“下一微指令”,模型机机执行到下一个微指令,点击“下一指令”,模型机机执行到下一条指令。观察各个芯片的状态,思考模型机的运行原理。
- 4 -
四、课程设计的要求
1、根据题目内容,查阅资料。
2、编写课程设计预习报告。
3、编制程序及调试程序。
4、分析总结,写出课程设计报告,报告中应该包含程序功能与使用说明、程序功能实现方法说明、如流程图与算法参数说明等内容,设计经验体会总结,源程序清单。
5、实验过程由指导老师监督,听从老师安排和督导。
6、每次任务完成后由指导老师逐个的检查实验内容、结果并评分,不符合要求的重写
五、实验详细设计
1)统计文件中各字母出现的频率
一、实验原理
在程序中,以是否读到ASCII码为0作为字符串末尾结束的标志;读取文件,并对文件中的字符串进行逻辑判断(不同字母之间各自对应的ASCII码),统计字符数。
二、 实验目的
经过该实验知道如何通过编写汇编程序读取文件并且读取文件中内容;通过分支程序设计来统计字符数,
三、实验设计内容
读取文件代码段:
MOV AX,DATAS
MOV DS,AX ;置数据段寄存器 ;
MOV DX,OFFSET FNAME
MOV AX,3D00H ;读打开指定文件 INT 21H
JNC OPEN ;打开成功,转 OPEN MOV SI,OFFSET ERROR1 ;显示打开不成功提示信息 CALL DMESS
JMP OVER
- 5 -
;
OPEN:
MOV BX,AX ;保存文件代号
GO: CALL READ_CHAR ;从文件中读一个字符 JC READ_ERROR ;如读出错,则转
CMP AL,EOF ;读到文件结束符吗? JZ TYPE_OK
CALL PUTCH
JMP GO
将文件内容推入栈中,并输出:
READ_CHAR PROC
MOV CX,1
MOV DX,OFFSET BUFFER ;置缓冲区地址 MOV AH,3FH ;置功能调用号 INT
21H ;读
JC R2 ;读出错,转 CMP AX,CX ;判断文件是否结束 MOV AL,EOF ;若文件已经结束,置文件结束符 JB R1 ;文件确定已经结束,转到 MOV AL,BUFFER ;文件未结束,取所读字符 R1:CLC
R2:RET
READ_CHAR ENDP
;
DMESS PROC
DMESS1:MOV DL,[SI]
INC SI
OR DL,DL
- 6 -
JZ DMESS2
MOV AH,2
INT 21H
JMP DMESS1
DMESS2:RET
DMESS ENDP
PUTCH PROC
PUSH DX
MOV DL,AL
MOV AH,2
INT 21H
POP DX
文件主体部分(对所读字符ASCII码进行比较判断并统计字符数): mov CL,41H
LEA DI,ARRAY
MOV CH,AL
CMP CH,CL ;若IF<41H(A),OTHERS++ JB OTHER
CMP CH,5AH ;若IF>5AH(Z),跳转继续比较 JA HIGHER2
H1:
CMP CH,CL
JE CHAR ;若IF=41H(A),CHAR[0]++
JA LOOP1 ; 若IF>41H(A),跳L1比较42H(B)
LOOP1:
INC CL
ADD DI,1
- 7 -
JMP H1
HIGHER2:
mov CL,61H LEA DI,ARRAY
CMP CH,CL JB OTHER
CMP CH,7AH ; JA OTHER
H2:
CMP CH,CL
JE CHAR JA LOOP2
LOOP2:
INC CL ADD DI,1 JMP H2
CHAR:
XOR CH,CH
MOV CH,[DI] INC CH
mov [DI],CH 若IF<61H(A),OTHERS++ 若IF>7AH(Z),跳转继续比较 若IF=61H(a),CHAR[0]++ 若IF>61H(a),跳L02比较62H(b) - 8 - ;;;
OTHER:
INC OTHERS ;OTHERS++
;比较结束
四、实验截图
2)用递归计算50以内Fibonacci 数, 以十进制数输出
一、实验目的
通过该实验充分了解递归程序的用法
二、实验内容
- 9 -
三、实验设计内容
循环递归代码段(主要实现递归调用斐波那契函数) MOV AX,F1 ;ax=0
ADD AX,F2 ;ax=1
JC EXIT ;若有进位则跳出
MOV BX,F2 ;bx=1
MOV F1,BX ;f1=1
MOV F2,AX ;f2=1
CALL OUTPUT ;调用output
MOV DL,' ' ;每个数字后的空格
MOV AH,2
INT 21H
DEC N
JNZ LP
EXIT:
MOV AH,4CH
INT 21H ;返回DOS
输出斐波那契数:
OUTPUT:
MOV BX,10
MOV CX,0
OL1:MOV DX,0
DIV BX ;ax=0,dx=1
ADD DL,'0' ;加上30h,使数字3变成字符3 PUSH DX
INC CX ;CX=0,每次加1
CMP AX,0 ;比较ax=1和0
JNZ OL1
MOV AH,2 ;字符输出,要输出的字符已经在dl中 OL2:
POP DX
INT 21H
LOOP OL2
RET
四、实验结果
- 10 -
3)虚拟平台的模型机实验设计
1、 实验目的
1) 掌握模型机的基本原理和结构
2) 掌握机器指令与微程序的对应关系;
3) 掌握机器指令的执行流程;
2、 实验设备
74LS181芯片两片,memory 6116一片,微程序控制存储器芯片一片,编译器芯片一片,八位同步计数器芯片一片,ALU_G芯片一片,PC_G芯片一片,74LS273
- 11 -
芯片若干,输入,输出芯片各一片,选择器芯片若干,连接器芯片若干,灯泡若干,开关若干等。
3、环境
组成原理虚拟实验室采用的是B/S架构,在客户端电脑上的浏览器地址栏中输入正确的地址进行访问即可。网址为http://192.168.1.252/pco/Entry.html。 4、实验原理
图1 模型机示意图
图1中所示模型机包括运算器、存储器、微控器、输入设备、输出设备以及寄存器。这些部件的动作控制信号都有微控器根据微指令产生。需要特别说明的是由机器指令构成的程序存放在存储器中,而每条机器指令对应的微程序存储在微控器中的存储器中。模型机详细原理见附件。 5、实验内容
1)选择实验设备,将所需要的组件从组件列表中拖到实验设计流程栏中 2)搭建实验流程:根据原理图1和电路图(见附件),将已选择的组件进行连线。
- 12 -
3)输入机器指令:选择菜单中的“工具”,再选择“模型机调试”,在指令输入窗口中输入如下指令: 00000000 00010000 00001001 00100000 00001011 00110000 00001011 01000000 00000000 00000001
本实验设计机器指令程序如下:
4)这里做的是个加法运算,第一个加数已经存入到内存的0000 1010单元
中,第二个加数是需要手工输入的。在实验运行面板中点击“运行”按钮,选择“输入”芯片,设置输入的数据后,双击连接“输入”芯片的单脉冲,这样第二个加数就设置好了。
5)在实验运行面板中双击连续脉冲,模型机便开始工作,观察各个芯片的状
态。或者在模型机调试窗口中(如图2所示)点击“指令执行”选项卡,在模型机调试窗口中点击“下一时钟”,模型机机执行到下一个时钟,点击“下一微指令”,模型机机执行到下一个微指令,点击“下一指令”,模型机机执行到下一条指令。观察各个芯片的状态,思考模型机的运行
- 13 -
原理。
图2 模型机调试窗口
6、具体过程实现
(1) 控制器把PC中的指令地址送往地址寄存器AR,并发出读命令。存储器按给
定的地址读出指令,经由存储器数据寄存器MDR送往控制器,保存在指令寄存器IR中。
(2) 指令译码器ID对指令寄存器IR中的指令进行译码,分析指令的操作性质,
并由控制电路向存储器、运算器等有关部件发出指令所需要的微命令。
(3) 当需要由存储器向运算器提供数据时,控制器根据指令的地址部分,形成
数据所在的存储单元地址,并送往地址寄存器AR,然后向存储器发出读命令,从存储器中读出的数据经由存储器数据寄存器MDR送往运算器。
(4) 当需要由运算器向存储器写入数据时,控制器根据指令的地址部分,形成
数据所在的存储单元地址,并送往存储器地址寄存器AR,再将欲写的数据存入存储器数据寄存器MDR,最后向存储器发出写命令,MDR中的数据即被写入由MAR指示地址的存储单元中。
(5) 一条指令执行完毕后,控制器就要接着执行下一条指令。为了把下一条指
令从存储器中取出,通常控制器把PC的内容加上一个数值,形成下一条指令的地址,但在遇到“转移”指令时,控制器则把“转移地址”送入PC。 - 14 -
控制器不断重复上述过程的(1)到(5),每重复一次,就执行了一条指令,直到整个程序执行完毕
7、设计结果截图
虚拟实验室连线截图:
执行第一个指令:
- 15 -
执行第二个指令:
- 16 -
执行第三个指令:
执行第四个指令:
.
- 17 -
执行第五个指令
:
- 18 -
执行第六个指令:
六、使用说明
两个程序使用汇编语言在“Masm for Windows集成实验环境”下编写,在MS-DOS模拟平台下运行。使用情况如详细设计所述。
七、总结与心得体会
为期两周的计算机组成原理与汇编课程设计就结束了,在这段时间呢,完成了诸多实验题目,解决了许多问题,包括计算机组成与那里和汇编语言。在充实而忙碌的课程设计同时,最重要的还是巩固并进一步学习了像组成原理和汇编这样更接近低层的软硬件知识,而不再是仅仅局限于像C、C++或是Java这样的高级语言开发。
理论学习只是一个学习初期阶段,只有经过了亲身实践操作,才能叫是真正掌握了知识技能。就像是这个学期的课程设计初期一样,初次开始汇编课设,我对汇编并不是十分了解,只是简简单单懂得几句语言而已或者说只会读懂程序,做几个题而已。至于如何将它们拼凑到一起组成一个实现一定功能的完整程序,成了我面前巨大的障碍,所以刚开始时,我也是束手无策,毫无头绪。但是通过对教材的复习,查阅相关文献和网络资料,我慢慢懂得并熟悉了这个过程。
课程设计完了之后,我才真切意识到,低级的东西并不十分简单,恰恰相 - 19 -
反,没有艰辛的付出,没有刻苦的努力,任谁也永远不能攻克它。
八、参考文献
[1].Patric Juola.《计算机组成与汇编语言原理》.机械工业出版社
[2].沈美明.《IBM-PC汇编语言程序设计》.清华大学出版社
[3].唐朔飞.《计算机组成原理》.高等教育出版社
九、附录
1、字符统计.asm:
DATAS SEGMENT
FNAME DB 'TEST.TXT',0 ;文件名
ERROR1 DB 'File not found',07H,0 ;提示信息
ERROR2 DB 'Reading error',07H,0
STRING1 DB 'Number of $' ;各类字符提示信息 STRING2 DB ': $'
ARRAY DB 26 DUP(0) ;字母
OTHERS DB 0 ;其他
BUFFER DB ?
EOF DB 035 ;以#结
束 ;1字节的缓冲区、
DATAS ENDS
;代码段
- 20 -
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX ;
MOV DX,OFFSET FNAME
MOV AX,3D00H INT 21H
JNC OPEN MOV SI,OFFSET ERROR1 CALL DMESS
JMP OVER
;
OPEN:
MOV BX,AX
GO: CALL READ_CHAR JC READ_ERROR CMP AL,EOF JZ TYPE_OK
CALL PUTCH
JMP GO
READ_ERROR:MOV SI,OFFSET ERROR2
;置数据段寄存器 ;读打开指定文件 ;打开成功,转 OPEN ;显示打开不成功提示信息 ;保存文件代号 ;从文件中读一个字符;如读出错,则转 ;读到文件结束符吗? - 21 -
CALL DMESS
;
TYPE_OK:MOV AH,3EH
INT 21H
CALL ENDLINE
CALL SHOW
OVER: MOV AH,07;为了显示
INT 21H ;为了显示
MOV AH,4CH
INT 21H
;
READ_CHAR PROC
MOV CX,1
MOV DX,OFFSET BUFFER
MOV AH,3FH 功能调用号
INT
21H
JC R2 转
CMP AX,CX 文件是否结束
- 22 - ;置缓冲区地址 ;置读 ;读出错,;判;
MOV AL,EOF ;设文件已经结束,置文件结束符
JB R1 ;文件确已结束,转
MOV AL,BUFFER ;文件未结束,取所读字符
R1:CLC
R2:RET
READ_CHAR ENDP
;
DMESS PROC
DMESS1:MOV DL,[SI]
INC SI
OR DL,DL
JZ DMESS2
MOV AH,2
INT 21H
JMP DMESS1
DMESS2:RET
DMESS ENDP
PUTCH PROC
PUSH DX
- 23 -
MOV DL,AL
MOV AH,2
INT 21H
POP DX
mov CL,41H
LEA DI,ARRAY
MOV CH,AL
CMP CH,CL ;若IF<41H(A),OTHERS++ JB OTHER
CMP CH,5AH ;若IF>5AH(Z),跳转继续比较 JA HIGHER2
H1:
CMP CH,CL
JE CHAR ;若IF=41H(A),CHAR[0]++
JA LOOP1 ; 若IF>41H(A),跳L1比较42H(B)
LOOP1:
INC CL
ADD DI,1
JMP H1
- 24 -
HIGHER2:
mov CL,61H LEA DI,ARRAY
CMP CH,CL JB OTHER
CMP CH,7AH JA OTHER
H2:
CMP CH,CL
JE CHAR JA LOOP2
LOOP2:
INC CL ADD DI,1 JMP H2
CHAR:
若IF<61H(A),OTHERS++ 若IF>7AH(Z),跳转继续比较 若IF=61H(a),CHAR[0]++ 若IF>61H(a),跳L02比较62H(b) - 25 - ;;;;
XOR CH,CH
MOV CH,[DI]
INC CH
mov [DI],CH
OTHER:
INC OTHERS ;OTHERS++ ;比较结束
RET
PUTCH ENDP
SHOW PROC
LEA SI,ARRAY
MOV DI,41H
LOOP3:
LEA DX,STRING1 ;字符串的输出Number of MOV AH,09H
INT 21H
MOV DX,DI
- 26 -
MOV AH,02H
INT 21H
LEA DX, STRING2 ;字符串的输出
MOV AH,09H
INT 21H
XOR AX,AX
MOV Al,[SI] ;将统计的数字送AX
ADD SI,1
CALL DISPLAY ;调用输出两位数字的子程序 CALL ENDLINE
INC DI
CMP DI,5BH
JB LOOP3
MOV AH,4CH
INT 21H
RET
SHOW ENDP
ENDLINE PROC NEAR;控制输出格式,输出回车换行子程序 MOV AH,02H
MOV DL,0AH
; INT 21H ;输出换行符
- 27 -
MOV AH,02H
MOV DL,0DH
; INT 21H ;输出回车符
RET
ENDLINE ENDP
DISPLAY PROC NEAR;输出两位数字的子程序(输出两位数字为十进制) MOV BL,10
DIV BL ;AX/BL,AL=商,AH=余数
PUSH AX ;保存AX中的信息
MOV DL,AL
ADD DL,30H
MOV AH,02H
INT 21H ;输出十位数
POP AX ;出栈送AX
MOV DL,AH
ADD DL,30H
MOV AH,02H
INT 21H ;输出个位数
RET
DISPLAY ENDP
CODES ENDS
END START
- 28 -
2、斐波那契数(小于50).asm:
DATAS SEGMENT
M1 DB 13,10,'Fibonacci number Below 50 is: $' N DW 8
F1 DW 0
F2 DW 1
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
LEA DX,M1
MOV AH,9
INT 21H
MOV DL,'1' ;输出1和空格,1在dl中 MOV AH,2
INT 21H
MOV DL,' '
- 29 -
INT 21H
LP:
MOV AX,F1 ;ax=0
ADD AX,F2 ;ax=1
JC EXIT ;若有进位则跳出 MOV BX,F2 ;bx=1
MOV F1,BX ;f1=1
MOV F2,AX ;f2=1
CALL OUTPUT ;调用output
MOV DL,' ' ;每个数字后的空格 MOV AH,2
INT 21H
DEC N
JNZ LP
EXIT:
MOV AH,4CH
INT 21H ;返回DOS
OUTPUT:
MOV BX,10
- 30 -
MOV CX,0
OL1:MOV DX,0
DIV BX ;ax=0,dx=1
ADD DL,'0' ;加上30h,使数字3变成字符3 PUSH DX
INC CX
CMP AX,0
JNZ OL1
MOV AH,2
OL2:
POP DX
INT 21H
LOOP OL2
RET
CODES ENDS
END START
;CX=0,每次加1 ;比较ax=1和0 ;字符输出,要输出的字符已经在dl中- 31 -
、 - 32 -