文档库 最新最全的文档下载
当前位置:文档库 › 11计本3班 大小写字母转换课程设计

11计本3班 大小写字母转换课程设计

安徽省巢湖学院计算机与信息工程学院

课程设计报告

课程名称微机原理

课题名称大小写字母转化

专业班级11计本(3)班

学号11011183

姓名李威

联系方式182********

指导教师叶海燕

完成日期: 2013 年 1 月 5 日

目录

摘要.................................................................... I 1 原理. (1)

1.18086简介 (1)

1.2汇编程序设计简介 (2)

1.3报警设计 (2)

2程序设计 (4)

2.1程序设计流程图 (4)

2.2从键盘接受字符程序段 (5)

2.3大写字母转换成小写字母程序段 (5)

2.4小写字母转换成大写字母程序段 (6)

2.5报警程序段 (7)

2.6总程序代码 (8)

3 运行结果分析 (11)

4心得体会 (12)

参考文献 (13)

摘要

在课程设计之前,具备微机原理的理论知识和实践能力;熟悉汇编语言编程技术;熟悉80X86的CPU结构和指令系统;熟悉相关常用接口电路的设计使用方法是必不可少的。因此原理部分重新温习并整理了相关知识。

课程设计要求进行大小写字母的转换。其实字母大小写的区别在于他们的ASCII码范围,它们之间的转换其实就是加减相应的ASCII码值。在判断输入的字母是大写的还是小写的(即判断输入符号ASCII码在41H~5AH还是在61H~7AH内)之后,决定判断是加上还是减去ASCII码值。另外如果输入的不是字母(输入字符对应ASCII码值不在41H~5AH或61H~7AH内),则需要报警提示,这不但涉及到用汇编语言实现发声的方法,而且对计算机硬件的了

关键词:8086 大小写字母转换报警

1 原理

1.1 8086简介

Intel 8086拥有四个16位的通用寄存器,也能够当作八个8位寄存器来存取,以及四个16位索引寄存器(包含了堆栈指标)。资料寄存器通常由指令隐含地使用,针对暂存值需要复杂的寄存器配置。它提供64K 8 位元的输出输入(或32K 16 位元),以及固定的向量中断。大部分的指令只能够存取一个内存位址,所以其中一个操作数必须是一个寄存器。运算结果会储存在操作数中的一个。

Intel 8086有四个内存区段(segment) 寄存器,可以从索引寄存器来设定。区段寄存器可以让 CPU 利用特殊的方式存取1 MB内存。8086 把段地址左移 4 位然后把它加上偏移地址。大部分的人都认为这是一个很不好的设计,因为这样的结果是会让各分段有重叠。尽管这样对组合语言而言大部分被接受(也甚至有用),可以完全地控制分段,,使在编程中使用指针 (如C 编程语言) 变得困难。它导致指针的高效率表示变得困难,且有可能产生两个指向同一个地方的指针拥有不同的地址。更坏的是,这种方式产生要让内存扩充到大于 1 MB 的困难。而 8086 的寻址方式改变让内存扩充较有效率。

80X86从功能上分执行单元EU(Execution Unit),和总线接口单元BIU(Bus Interface Unit),执行单元由算术逻辑单元(ALU)、标志寄存器、通用寄存器组和EU控制器等部件组成。

指令执行部件EU由算术逻辑单元、标志寄存器、通用寄存器和EU控制器等部件组成。

主要功能是执行指令:

一般顺序执行,EU不断地从指令队列中取指令连续执行,而省去访问存储器取指令的时间。

需要访问存储器取操作数时,EU将访问地址送给BIU后,将要等待操作数到来后才能继续操作;

遇到转移类指令时,要将指令队列中的后续指令作废,等待BIU重新从存储器取出目标地址中的指令代码进入指令队列后,EU才能继续执行指令。

1

算术逻辑单元(ALU)完成16位或8位的二进制运算;16位暂存寄存器用来暂存参加运算的操作数。运算结果通过内部总线送到通用寄存器组或BIU的内部寄存器中等待写入存储器。经ALU运算后的结果特征置入标志寄存器中保存

EU控制器负责从BIU的指令队列中取指令,并对指令译码;根据指令要求向EU内部各部件发出控制命令以完成各条指令的功能。

总线接口单元由地址加法器、专用寄存器组、指令队列缓冲器和总线控制电路等部件组成;

主要功能是形成访问存储器的物理地址,负责与外部(存储器或I/O接口)打交道。

1.2汇编程序设计简介

汇编:计算机不能直接识别和执行汇编语言程序,而要通过“翻译”把源程序译成机器语言程序(目标程序)才能执行,这一“翻译”工作称为汇编。汇编有人工汇编和计算机汇编两种方法。

汇编语言是面向机器的,每一类计算机分别有自己的汇编语言。汇编语言占用的内存单元少,执行效率高,广泛应用于工业过程控制与检测等场合。

汇编语言语句格式

标号:操作符操作数;注释

START: MOV AX , 50H ;AX←(50H)

标号用来标明语句地址,它代表该语句指令机器码的第一个字节的存储单元地址。

标号一般规定由1~8个英文字母或数字组成,但第一个符号必须是英文字母。

注释只是对语句或程序段的含义进行解释说明,以方便程序的编写、阅读和交流,简化软件的维护,一般只在关键处加注释。

伪指令:伪指令只用于汇编语言源程序中,对汇编过程起控制和指导的作用,不生成机器码。汇编结束,自动消失。

汇编语言程序设计步骤:分析问题;确定算法;设计程序流程;分配内存单元:分配内存工作单元,确定程序和数据区的起始地址;编写汇编语言程序;调试程序;

1.3报警设计

8253/8254是早期的PC系列机中有一个专门用于定时的集成电路,定时器通道3的G

端与61H端口的bit0位相联,如果将61H端口的bit0位置成1,那么定时器通道3就被启动,此时将有一组信号从OUT端输出,信号的频率可以用程序控制;若61H端口bit0

位为0,则定时器被关闭,OUT端就会恒定为1

此电路用在这里相当一个"可控开关",如果将61H端口的bit0、bit1位都置成1,则相当于既打开了定时器又打开了开关,这时候定时器产生的声音信号就会送到放大器推动喇叭发声;若将bit0位置0,则定时器关闭,此时OUT端为1,这时候如果连续改变bit1位的状态,也可以从喇叭中听到声音若将bit1位置0,则开关关闭,此时即使打开定时器也不能听到声音。

PC中的定时电路有三个通道,通道3用于发声,通道1用于控制系统内部的时钟。大家都十分清楚用DOS的"TIME"命令可以观察并修改系统内部的一个时钟,这个时钟之所以能连续运转主要依靠定时器的通道1。

通道1的工作方式和通道3一样,但是系统启动时设定其发出一个频率固定为18.2Hz 的信号,这个信号直接送到系统中的"中断控制器"。每一个"Hz"都产生一个硬件中断,一般称这个硬中断为"IRQ0",对应的中断号是08H。也就是说,当计算机启动后,我们的机器看上去十分平静,但实际上CPU非常忙碌。在定时器的控制下每隔55毫秒就要执行一个08H号中断,这个中断的主要工作就是连续地计数。

在内存"0040H:006CH"处有四字节的存储空间专门用于保存计数值,CPU每执行一次08H中断,这四字节的计数值就被加1,不难算出这个计数值每增加1091后时间恰好过了1分钟,每增加65454后时间恰好过了1小时。系统内部的时钟之所以能准确走时,靠得就是08H中断和这四字节的计数值。因此我们要想精确的定时,必须依靠时钟计数值才行。

2程序设计

2.1 程序设计流程图

图2.1流程图

2.2 从键盘接受字符程序段

本程序段要求能够从键盘接受字符,从而做出下面的判断是字母还是其他字符。程序段如下:

lea bx,array

mov ax,cs

mov ds,ax

mov dx,offset p1

mov ah,0ah

int21h

程序段中的一些指令功能:

MOV:数据传送指令。将源操作数传送到目的操作数中。

OFFSET:取源操作数首地址。

int 21h:结束

该程序段先将array的首地址给bx,将cs付给ax,再将ax传到ds中,将pl的偏移量给dx,接着调用中断21的0a号功能从键盘接收字符。

2.3大写字母转换成小写字母程序段

本程序段要求实现大写字母转换成小写字母的设计,可以根据A~Z的ASCII码来进行程序设计,若小于A的ASCII码41h则跳至报警程序,若大于Z的ASCII码5ah则跳至小写转换成大写字母程序,若在41h~5ah范围内,则将其ASCII码加20h,从而实现大写字母转换成小写字母。程序段如下:

next: inc di;di自加

cmp array[di],'$' ;比较

je exit ;相等,则跳到exit执行

cmp array[di],41h;(A~Z-->41h-5ah a~z-->61h-7ah)与A比较 jl exit1 ;小于,则跳

cmp array[di],5ah;与Z比较

jg next1 ;大于,则跳

add array[di],20h;加20h,大写转小写

该程序段中的一些指令功能:

INC:自动加1指令。执行后操作数自动加1。

CMP:比较指令。将源操作数和目的操作数相减,结果不存储。影响标志位。

JE:条件跳转指令。相等则跳转。

JL:条件跳转指令。小于则跳转。

JG:条件跳转指令。大于则跳转。

ADD:算术加法指令。将两操作数相加,结果放目的操作数。

该程序段中,cmp array[di],41h表示将输入的字符与大写字母A(41h)进行比较。jl exit1,表示若小于41h则跳到报警程序发出错误报警。add array[di],20h,表示将输入字符的ASCII码加上20h,从而实现大写转换成小写。

2.4小写字母转换成大写字母程序段

本程序段要求实现小写字母转换成大写字母的设计,可以根据a~z的ASCII码来进行程序设计,若小于a的ASCII码61h则跳至小写转换成大写字母程序,若大于z的ASCII 码7ah则跳至报警程序,若在61h~7ah范围内,则将其ASCII码加20h,从而实现小写字母转换成大写字母。程序段如下:

next1: cmp array[di],'$' ;比较

je exit ;相等,则跳到exit执行

cmp array[di],61h;(A~Z-->41h-5ah a~z-->61h-7ah)与a比较

jl next ;小于,则跳

cmp array[di],7ah;与z比较

jg exit1 ;大于,则跳

sub array[di],20h;减20h,小写转大写

jmp next

该程序段中的一些指令功能:

CMP:比较指令。将源操作数和目的操作数相减,结果不存储。影响标志位。

JE:条件跳转指令。相等则跳转。

JL:条件跳转指令。小于则跳转。

JG:条件跳转指令。大于则跳转。

SUB:算术减法指令。将目的操作数减源操作数,结果送目的操作数。。

JMP:无条件转移指令。

该程序段中,sub array[di],20h,表示将输入字符的ASCII码减去20 从而实现建小写字母转换成大写。jmp next,无条件转移到next程序段,从而实现程序的循环,对输入的字符串中的下一个字符进行判断。

2.5 报警程序段

该程序段为调用程序,要求能够实现错误报警。当输入的字符为非大小写字母时能够报警发声。此程序断可以根据字符的ASCII码来进行判断。此程序断可以用堆栈来进行设计。程序设计如下:

sound proc

push ax

push dx

mov dx, cx

in al,61h

and al,11111100b;使第0,1位为0

trig: xor al,2;使第1位翻转 PB的低两位为3,即使输出有效out61h,al

mov cx,bx

delay:loop delay

dec dx

jne trig

pop dx

pop ax

ret

该程序段中的一些指令功能:

PUSH:将源操作数内容压栈,同时自动修改栈顶指针。

POP:从堆栈弹出数据,实现与PUSH相反的操作。

LOOP:循环指令。每执行一次循环次数自动减一。

IN:传送指令。从I/O端口输入数据至AL或AX。

OUT:传送指令。将AL或AX的内容输出至I/O端口。

2.6 总程序代码

从从键盘输入一串英文字符,若是小写字符则转换成大写字符在下一行输出,若是大写字符则转换成小写字符在下一行输出,若不是英文字符则显声响报警。

;--------------------------------------------------------------------

; 实现英文字母的大小写转换

;--------------------------------------------------------------------

code segment;代码段

assume cs:code,ds:code

org 100h;从100h开始

start:jmp begin ;跳到begin

p1 db100

p2 db0

array db100h dup(?) ;置100个字节的缓冲区存放数据

begin:

lea bx,array ;将array的首地址给bx

mov ax,cs;置cs-->ds

mov ds,ax

mov dx,offset p1 ;将p1的偏移量给dx

mov ah,0ah;调用中断21的0a号功能从键盘接收字符

int21h

xor bx,bx;将bx清零

mov bl,p2 ;p2-->bl

mov array[bx],'$' ;送'$'至字符串尾

mov di,0ffffh;-1-->di

next:

inc di;di自加

cmp array[di],'$' ;比较

je exit ;相等,则跳到exit执行

cmp array[di],41h;(A~Z-->41h-5ah a~z-->61h-7ah)与A比较 jl exit1 ;小于,则跳

cmp array[di],5ah;与Z比较

jg next1 ;大于,则跳

add array[di],20h;加20h,大写转小写

jmp next

next1:

cmp array[di],'$' ;比较

je exit ;相等,则跳到exit执行

cmp array[di],61h;(A~Z-->41h-5ah a~z-->61h-7ah)与a比较 jl next ;小于,则跳

cmp array[di],7ah;与z比较

jg exit1 ;大于,则跳

sub array[di],20h;减20h,小写转大写

jmp next

disp:

loop next

exit:

mov p1,0dh;回车换行

mov p2,0ah

mov ah,09h

int21h

jmp begin

exit1:

mov p1, 0dh

mov p2, 0ah

call sound ;调用发声子程序

call sound

jmp begin

mov ah,4ch;程序结束

int21h

sound proc

push ax

push dx

mov dx, cx

in al,61h

and al,11111100b;使第0,1位为0

trig: xor al,2;使第1位翻转 PB的低两位为3,即使输出有效out61h,al

mov cx,bx

delay:loop delay

dec dx

jne trig

pop dx

pop ax

ret

sound endp

code ends

end begin

3 运行结果分析

当输入字母串ABCDEFabcdef后,按回车键转换为abcdefABCDEF,结果如下图3.1所示:

图3.1 运行结果

当输入非英文字母时,按下回车键后发出滴滴的报警声,无法转换大小写,光标指向错误字符。结果如下图3.2所示:

图3.2 错误运行结果

4心得体会

通过这一个星期微机原理的课程设计,我对微机原理这门课程有了更进一步的了解。通过自己积极地查阅相关资料,请教老师,与同组的同学一起讨论,最终完成设计。

本学期做了许多微机原理的实验,这次要用汇编语言来实现大小写字母的转换,所以自己一开始感觉这会非常的简单。直到真正的理解相关原理,要编写程序实现的时候,才发现,自己对汇编程序的了解确实还不够,尤其是编程方面的能力有待提高。在不断地再次学习和理解过程中,我慢慢掌握了更多汇编语言的应用知识,更为值得骄傲的是,自己在参考程序的辅助下顺利编写出了大小写字母转换的程序。

把编写好的程序输入软件时候,出现了许多小问题,比如句子没有加逗号,没有定义变量等等。归纳起来都是因为编程掌握不牢固,写程序没有条理,加上自己粗心大意的恶习依旧没改正造成的,以后需要努力改正。

通过本次课程设计我学到了很多新的东西,极大地拓宽了我的知识面,锻炼了能力,综合素质也得到较大提高,我感到收获不小。但在设计中也发现了大量问题,有些在设计过程中已经解决,有些还需要在今后慢慢学习,只要学习就会有更多的问题,有更多的难点,但也会有更多的收获。

总的来说,这次课程设计,自己受益匪浅。不但加固了微机原理部分知识的理解,而且加强了对汇编语言的应用能力。

参考文献

[1] 姚燕南,薛钧义主编.微型计算机原理.第四版.西安:西安电子科技大学出版社,2003

[2] 王萍. 微机原理应用实践. 北京:机械工业出版社,2001

[3] 雏逢兴编著.计算机硬件技术基础.北京:高等教育出版社,1998

[4] 王永山等编著.微型计算机原理与应用.西安:西安电子科技大学出版社,1999

[5] 潘峰主编.微型计算机原理与汇编语言.第三版.西安: 电子工业出版社,2003

相关文档
相关文档 最新文档