1、用汇编语言对字母大小写转换物理与电气工程学院课程实践报告用汇编语言对字母大小写转换姓 名* *专业 电气工程及其自动化 班 级 电气工程及其自动化1班年级 2000级 指导教师 00 00 成 绩 日期 0000.6.20 一概述在计算机系统中有多种数制和编码,常用的数制有二进制、八进制以及十六进制,常用的代码有BCD码、ASCll码和七段显示码等。这些数制和编码根据其作用的不同,在存储形式上也有差异。在实际应用中,它们也因使用的要求不同而有所差异。在配备操作系统管理程序的计算机中,有些代码转换程序已在系统管理软件中编好。还有些代码转换需要根据使用要求通过编程完成。因此,代码转换是非数据处理中
2、最常见的情况。二设计要求完成一个字母或数制之间的转化程序,主程序分别具有可选择的子功能,按相应的字符,可分别进入相应的子功能并在屏幕上显示结果。可选择的子功能分别为:(1)实现小写字母向大写字母的转换(2)实现大写字母向小写字母的转换三设计思想与工作原理小写字母的ASC码比大写字母的ASC码大20H,因此,大写转小写就是将大写字母的ASC码加20H,反之,将小写字母的ASC码减20H。 大小写字母转换功能,是通过调用子函数input实现对字符串的输入,然后调用宏gaixie来实现对大小写的转换,其中宏是通过参数的传递来确定是小写转换成大写,还是大写转换成小写的。从而决定是对操作数进行加或减20
3、H。80x86从功能上分执行单元EU(Execution Unit),和总线接口单元BIU(Bus Interface Unit),执行单元由算术逻辑单元(ALU)、标志寄存器、通用寄存器组和EU控制器等部件组成。 指令执行部件EU由算术逻辑单元、标志寄存器、通用寄存器和EU控制器等部件组成。 主要功能是执行指令: 一般顺序执行,EU不断地从指令队列中取指令连续执行,而省去访问存储器取指令的时间。 需要访问存储器取操作数时,EU将访问地址送给BIU后,将要等待操作数到来后才能继续操作; 遇到转移类指令时,要将指令队列中的后续指令作废,等待BIU重新从存储器取出目标地址中的指令代码进入指令队列后
4、,EU才能继续执行指令。 总线接口单元由地址加法器、专用寄存器组、指令队列缓冲器和总线控制电路等部件组成; 主要功能是形成访问存储器的物理地址,负责与外部(存储器或I/O接口)打交道。 正常情况下,BIU通过地址加法器形成指令的物理地址,从给定存储器地址中取出指令代码送指令队列缓冲器中等待执行(指令队列缓冲器中出现一个空字节,BIU将自动进行读指令的操作填满队列)。 收到EU送来的操作数地址,BIU将立即形成操作数的物理地址,完成读/写操作数或运算结果功能。遇到转移类指令,BIU将指令队列缓冲器中的尚存指令作废,重新从存储器目标地址中取指令送指令缓冲器中。 指令队列可存放6字节的指令代码。一般
5、情况下指令队列中总是填满指令,使EU可不断地得到执行的指令。 16位地址加法器专门用来完成由逻辑地址变换成物理地址的功能。实际上是进行一次地址加法,将两个16位的逻辑地址转换为20位的物理地址,以达到可寻址1M字节的存储空间。 总线控制电路将8086CPU的内部总线与外部总线相连,是8086CPU与外部交换数据的必经之路。包括16条数据总线、20条地址总线和若干条控制总线。程序装载到内存中后通过16位数据线确定各个段地址,开始取出指令(内存中读字节),放到指令队列,队列出口通过EU控制器执行指令并同时影响IP(指令指针移动指令长度,或通过指令执行后影响IP。(1)汇编: 计算机不能直接识别和执
6、行汇编语言程序,而要通过“翻译”把源程序译成机器语言程序(目标程序)才能执行,这一“翻译”工作称为汇编。汇编有人工汇编和计算机汇编两种方法。汇编语言是面向机器的,每一类计算机分别有自己的汇编语言。汇编语言占用的内存单元少,执行效率高,广泛应用于工业过程控制与检测等场合。(2)汇编语言语句格式 标号: 操作符 操作数 注释 Start: mov A:30H ;标号用来标明语句地址,它代表该语句指令机器码的第一个字节的存储单元地址。标号一般规定由18个英文字母或数字组成,但第一个符号必须是英文字母。注释只是对语句或程序段的含义进行解释说明,以方便程序的编写、阅读和交流,简化软件的维护,一般只在关键
7、处加注释。(3)伪指令伪指令只用于汇编语言源程序中,对汇编过程起控制和指导的作用,不生成机器码。汇编结束,自动消失。(4)汇编语言程序设计步骤 (1)分析问题 (2)确定算法(3)设计程序流程 (4)分配内存单元:分配内存工作单元,确定程序和数据区的起始地址。 (5)编写汇编语言程序 (6)调试程序 四程序流程图及其说明五流程图说明该程序流程图简要地表现出了所要实现的功能以及一些功能的大概算法,同时也是我编写的程序的一个总体的框架。 通过流程图,可以看出程序开始运行时,首先输出输入界面,在界面中输入字母(大小写均可),按回车键输出结果,大写输出小写,小写输出大写,或同时输入大小写,其结果也将以
8、小大写形式输出,此时结束程序,若程序中输入字母过多或频繁则报警器报警。六程序源代码code segment assume cs:code,ds:code org 100h start:jmp begin p1 db 100 p2 db 0array db 100h dup(?) begin: lea bx,array mov ax,cs mov ds,ax mov dx,offset p1 mov ah,0ah int 21h ;调用dos中断,等待用户输入字符串 xor bx,bx mov bl,p2 mov arraybx,$ mov di,0ffffh next: inc di cmp
9、arraydi,$ je exit cmp arraydi,41h ;41h表示A jl exit1 cmp arraydi,5ah ; Z jg next1 add arraydi,20h ;回车 jmp next ;判断是否为大写字母next1: cmp arraydi,$ je exit cmp arraydi,61h ;a jl next cmp arraydi,7ah ;z jg exit1 sub arraydi,20h ;回车 jmp next ;判断是否为小写字母 disp: loop nextexit: mov p1,0dh mov p2,0ah mov ah,09h int
10、 21h jmp begin code segment assume cs:code,ds:code org 100h start:jmp begin p1 db 100 p2 db 0array db 100h dup(?) begin: lea bx,array mov ax,cs mov ds,ax mov dx,offset p1 mov ah,0ah int 21h ;调用dos中断,等待用户输入字符串 xor bx,bx mov bl,p2 mov arraybx,$ mov di,0ffffh next: inc di cmp arraydi,$ je exit cmp arra
11、ydi,41h ;41h表示A jl exit1 cmp arraydi,5ah ; Z jg next1 add arraydi,20h ;回车 jmp next ;判断是否为大写字母next1: cmp arraydi,$ je exit cmp arraydi,61h ;a jl next cmp arraydi,7ah ;z jg exit1 sub arraydi,20h ;回车 jmp next ;判断是否为小写字母 disp: loop nextexit: mov p1,0dh mov p2,0ah mov ah,09h int 21h jmp beginexit1: mov p
12、1, 0dh mov p2, 0ah call sound call sound call sound call sound ;调用sound子程序 jmp begin code segment assume cs:code,ds:code org 100h start:jmp begin p1 db 100 p2 db 0array db 100h dup(?) begin: lea bx,array mov ax,cs mov ds,ax mov dx,offset p1 mov ah,0ah int 21h ;调用dos中断,等待用户输入字符串 xor bx,bx mov bl,p2 m
13、ov arraybx,$ mov di,0ffffh next: inc di cmp arraydi,$ je exit cmp arraydi,41h ;41h表示A jl exit1 cmp arraydi,5ah ; Z jg next1 add arraydi,20h ;回车 jmp next ;判断是否为大写字母next1: cmp arraydi,$ je exit cmp arraydi,61h ;通过循环依次判断每个字母是否为大写还是小写 61h表示小写字母 a, jl next cmp arraydi,7ah ;z jg exit1 sub arraydi,20h ;回车
14、jmp next ;判断是否为小写字母 disp: loop nextexit: mov p1,0dh mov p2,0ah mov ah,09h int 21h jmp beginexit1: mov p1, 0dh mov p2, 0ah call sound call sound call sound call sound ;调用sound子程序 jmp begin ;回到最初的状态,已达到循环输入字符串的目的。 mov ah,4ch int 21h ;程序结束sound proc push ax push dx mov dx, cx in al,61h and al,11111100b
15、 trig: xor al,2 out 61h,al mov cx,bx delay:loop delay dec dx jne trig pop dx pop ax retsound endpcode ends end begin mov ah,4ch int 21h ;程序结束sound proc push ax push dx mov dx, cx in al,61h and al,11111100b trig: xor al,2 out 61h,al mov cx,bx delay:loop delay dec dx jne trig pop dx pop ax retsound en
16、dpcode ends end beginexit1: mov p1, 0dh mov p2, 0ah call sound call sound call sound call sound ;调用sound子程序 jmp begin mov ah,4ch int 21h ;程序结束sound proc push ax push dx mov dx, cx in al,61h and al,11111100b trig: xor al,2 out 61h,al mov cx,bx delay:loop delay dec dx jne trig pop dx pop ax retsound e
17、ndpcode ends end begin七运行调试结果八设计过程中遇到的问题及解决办法 在这次课程设计中,我也遇到了一些困难,比如在分配内存工作单元,不能出现OBJ文件等一些问题,由于不熟悉掌握汇编语言的命令很容易出错。例如,程序编写错误或者汇编出错的时候很难发现错误出现在哪里。所以我们要熟悉掌握汇编语言命令。在编程过程中必须熟练的掌握一些语句。比如,程序开始语句、结束语句等程序中规范语句。后经请教同学,查阅资料得以解决。九心地体会 通过这学期的微机课设,我知道了自己的理论知识并不扎实。对于许多指令和一些基本的编程方法都掌握不清楚。通过我的认真在复习,我终于能基本理解一些语句及程序的含义,才开始设定我的大小写字母转换程序,用汇编语言来实现大小写字母的转换,首先:大写与小写相差32ASC11值,其实字母大小写的区别在于他们的码范围,它们之间的转换其实就是加减相应的码值。在判断输入的字母是大写的还是小写的(即判断输入符号码在41H5AH还是在61H7AH内)之后,决定判断是加上还是减去码值。在运行过程中,出现了些小错误,但都改正了。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1