计算机原理与汇编语言
课程设计报告
题目: 统计文件中各字母出现的频率
2019 年 7 月
1 设计目的
题目:给定一个英文 ASCII 码文件,统计文件中每个英文字母出现的次数,计算
每个英文字母出现的频率,并以十进制形式输出。
1.1 设计目标
确立价值塑造、能力培养、知识传授三位一体的课程目标,深入挖掘课程所
蕴含的思想政治教育元素和所承载的思想政治教育功能,融入课堂教学,达成德
育渗透的教学成效。课程设计是计算机原理与汇编语言教学过程中的重要环节。
本课程设计主要目的是使计算机专业学生深入学习计算机原理与汇编语言知识,
进一步提高学生计算机原理与汇编语言综合能力和程序设计技能,锻炼运用计算
机原理与汇编语言解决实际问题的能力。
1.2 设计要求
知识:
理解计算机系统的层次结构、计算机体系结构和计算机组成、冯?诺依曼计
算机的特点;熟练掌握计算机的运算方法;熟练掌握 CPU 的结构和功能,控制
单元的设计;理解计算机组织结构,中央处理器各寄存器结构、标志寄存器;熟
练掌握存储器的编址与组织管理,寻址机制;熟练掌握汇编指令系统指令使用;
熟练掌握循环、分支、调用等程序设计方法;熟练掌握高级宏汇编技术;熟练掌
握磁盘文件系统组织和设计。
能力:
掌握计算机原理和汇编语言程序设计方法和技术,将计算机原理和汇编语言
程序设计应用软件和系统设计;利用控制单元设计原理,学会计算机指令系统,
控制器设计方法;掌握汇编语言程序设计方法,在针对具体实际问题给出汇编语
1
言程序设计;在计算机原理和汇编语言程序设计知识的讨论中培养创新意识,提
高分析、发现、研究和解决问题的能力;培养综合分析问题解决问题和调试程序
的能力。
素质:
注重提高学生思想水平、政治觉悟、道德品质、文化素养等的培养。通过课
程设计中的分析讨论辩论培养分析沟通交流素质,建立计算机原理和汇编语言程
序设计的思维模式,提升理解计算机原理和汇编语言程序设计的基本素质。通过
课程设计,提升团队合作,交流沟通素质。
1.3 实验原理
程序首先打开文件,并进行读取,对文件中的内容(字符串)进行逻辑判断,
根据不同字母对应不同的 ASCII 码值来统计不同字母出现的次数;在程序中,
当读到 ASCII 码值为 0 的字符时说明字符串结束。
2 设计准备
2.1 设计环境
Masm for Windows 集成实验环境
2.2 设计原则
1、 书写的所有汇编语言代码应遵守灰暗语言规范。
2、 语言描述直接、清晰,保持代码简洁,避免语句复杂。
3、 修改后要及时删除旧代码,而不只是将其注释掉。
4、 风格要保持一致,使代码布局清晰,增强可读性。
5、 注释要通俗易懂,不产生歧义,避免加上并非必须的注解。注释使用的语句
要简洁,表达要清晰、准确,不要使人产生歧义,不可喧宾夺主。
2
3 程序设计思想
3.1 总体设计
为实现相应的功能,程序应具备打开文件、读取文本内容、对文本内容进行
分类统计等功能。程序应具备下面的流程图:
开始
打开文件
读取文本内容
对字符内容进行判别
统计各字母个数
错误处理
输出&结束
为实现相应的功能,程序应按照以下的步骤进行:
(1)置数据段寄存器,初始化变量
(2)读打开指定文件:
若打开成功,则读取文件中的数据;
若打开失败,则显示打开失败的提示信息;
(3)成功读打开文件后:
先保存文件代号,再从文件中读取一个字符;
若读取字符失败,则显示读取字符失败的提示信息;
若读取成功,并且未读取到文件结束符,则继续进行读取下一个字符的操作;
(4)读取文件中字符成功后,将文件内容推入栈中,并输出:
先置缓冲区地址,调用缓冲区调用;
读字符,若读出错,则转读出错代码;
3
判断文件是否结束,若结束,置文件结束符于栈中;
若文件未结束,取所读字符置栈中;
(5)对所读字符 ASCII 码进行比较判断并统计字符数:
若所读字符的 ASCII 码值小于 A 或大于 z,跳转继续比较下一个字符;
若所读字符的 ASCII 码值在 Z 和 a 之间,跳转继续比较下一个字符;
若读取字符的 ASCII 码值与 a-z,或者 A-Z 中某个字符 ASCII 码值相等,则
该字符个数加 1;
(6)统计结束后,显示输出统计出的对应字母个数
4 实现过程
4.1 读取文件代码段
读打开指定文件,若打开成功,则读取文件中的数据,若打开失败,则显示
打开失败的提示信息;成功读打开文件后:先保存文件代号,再从文件中读取一
个字符;若读取字符失败,则显示读取字符失败的提示信息;若读取成功,并且
未读取到文件结束符,则继续进行读取下一个字符的操作;
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 PUNCH
JMP GO
4
4.2 将文件压入栈中,并输出
读取文件中字符成功后,将文件内容推入栈中,并输出:先置缓冲区地址,
调用缓冲区调用;读字符,若读出错,则转读出错代码;判断文件是否结束,若结
束,置文件结束符于栈中;若文件未结束,取所读字符置栈中;
READ_CHAR PROC
MOV CX,1 ;要读取的字节数
MOV DX,OFFSET BUFFER ;置缓冲区地址
MOV AH,3FH ;读文件
INT 21H
JC R1 ;读出错,程序转移
CMP AX,CX ;判断文件是否结束
MOV AL,EOF
JB R2
MOV AL,BUFFER
R2: CLC
R1: RET
READ_CHAR ENDP
DMESS PROC
DMESS1:
MOV DL,[SI]
INC SI
OR DL,DL
JZ DMESS2
MOV AH,02H
INT 21H ;显示一个字符
JMP DMESS1
DMESS2:RET
DMESS ENDP
4.3 对所读字符 ASCII 码进行比较判断并统计字符
对所读字符 ASCII 码进行比较判断并统计字符数:若所读字符的 ASCII 码值
小于 A 或大于 z,跳转继续比较下一个字符;若所读字符的 ASCII 码值在 Z 和 a
之间,跳转继续比较下一个字符;若读取字符的 ASCII 码值与 a-z,或者 A-Z 中
某个字符 ASCII 码值相等,则该字符个数加 1;对于不在字母序列内的字符
PUNCH PROC
PUSH DX
5
MOV DL,AL
MOV AH,02H ;显示一个字符
INT 21H
POP DX
MOV CL,41H ;(A)
LEA DI,ARRAY
MOV CH,AL
CMP CH,CL
JB OTHER ;若IF<41H(A),OTHER++
CMP CH,5AH
JA HIGHER2 ;若IF>5AH(Z),继续比较
H1: CMP CH,CL
JE CHAR ;对应字母个数++
JA LOOP1
LOOP1:
INC CL
ADD DI,1
JMP H1
HIGHER2:
MOV CL,61H ;(a)
LEA DI,ARRAY
MOV CH,AL
CMP CH,CL
JB OTHER ;若IF<61H(a),OTHER++
CMP CH,7AH
JA OTHER ;若IF>7AH(z),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
6
OTHER:
INC OTHERS ;比较结束
5 运行结果
5.1 文本文件内容
aaaaabbbbbcccccdddddeeeeefffffggggghhhhhiiiiijjjjjkkkkklllllmmmmmnnnnnooooop
ppppqqqqqrrrrrssssstttttuuuuuvvvvvwwwwwxxxxxyyyyyzzzzz%*%
5.2 运行结果截图
先显示文件内容,然后显示各字符出现的字数
6 心得体会
6.1 问题及解决办法
(1)找不到文件,显示 file not found
解决办法:根据显示可知,出现这种情况的原因是找不到文件,可能出现的原因
有:一代码出错,导致无法找到文件或是打开文件;二是文件未创建成功;三是
7