微机原理课程设计报告li

江苏大学

微机原理课程设计报告

学院:       电气学院        

班级:              

姓名:                

学号:            

指导老师:               

时间:     20##年1月15日  

一.课程设计目的:

1.结合微型计算机原理课程的学习,进一步巩固已学的知识,同时针对计算机原理知识的具体应用,学会对系统中DOS和BIOS的使用。学会使用屏幕编辑程序——EDIT,弄懂汇编程序的上级过程以及如何运用DEBUG软件进行汇编程序的调试。

       2. 学会将课本上的理论知识和实际有机的结合起来,锻炼自己分析解决实际问题的能力。提高适应实际,实践编程的能力。

       3. 为了进一步巩固学习的理论知识,增强学生对所学知识的实际应用能力和运用所学的知识解决实际问题的能力,开始为期两周的课程设计。通过设计使学生在巩固所学知识的基础之上具有初步的单片机系统设计与应用能力。

二.课程设计内容:

1.接受年、月、日信息并显示的设计

  为掌握响铃使用方法,并掌握年、月、日输入方法。编写程序,先显示“WHAT IS THE DATA (MM/DD/YY)?”并响铃一次,然后接受键盘输入的月/日/年信息,并显示。

2. 字符串匹配设计

为掌握提示信息的设置方法及读取键入信息的方法,编写程序实现两个字符串比较,如相同则显示“MATCH”,否则显示“NO MATCH”。

3.从键盘输入数据并显示的设计

为掌握键盘接受数据的方法,并了解将键盘数据显示时必须转换为ASCII码的原理,编写程序,将键盘接受到的四位十六进制数据转换为等值的二进制数显示。

4.字符和数据的显示设计

为掌握字符和和数据的显示方法。编写程序,先显示信息:INPUT STRING,THE END FLAG IS$,再接受字符。如为0-9,则计数器加1,并显示数据;如为非数字,则直接显示,但不计数。

三.典型题目举例:

1.接收年月日信息并显示的设计

为掌握响铃使用方法,并掌握年、月、日输入方法。编写程序,先显示“WHAT IS THE DATA (MM/DD/YY)?”并响铃一次,然后接受键盘输入的月/日/年信息,并显示。

 流程图:

                                                                               

程序代码及注释:

DATA SEGMENT

S1  DB 'WHAT IS THE DATA (MM/DD/YY)? ',0DH,0AH,'$'        ;显示字符串

S2  DB 'MONTH',0DH,0AH,'$'                                 ;月字符串

S3  DB 'DAY',0DH,0AH,'$'                                   ;日字符串

S4  DB 'YEAR',0DH,0AH,'$'                                  ;年字符串

S5  DB 4                                               ;存放接受的月

    DB ?

    DB 4 DUP(‘$’)

S6  DB 4                                               ;存放接受的日

    DB ?

    DB 4 DUP(‘$’)

S7  DB 6                                               ;存放接受的年

    DB ?

    DB 6 DUP(‘$’)

DATA ENDS

CODE  SEGMENT

ASSUME CS:CODE,DS:DATA                               ;段寄存器初始化

START:MOV  AX,DATA                   

      MOV DS,AX                          

      MOV DX,OFFSET S1                                 ;显示提示信息

      MOV AH,9

      INT 21H

      MOV DL,07H                                           ;响铃一次

      MOV AH,2

      INT 21H

      MOV CX,0FFFH                         ;延迟,用内外双重循环实现

L1:PUSH CX

   MOV CX,0FFFFH

L2: LOOP L2

    POP CX

    LOOP L1

    MOV DX,OFFSET S5                           ;接受月数据,放入变量

    MOV AH,0AH

    INT 21H

    MOV DX,OFFSET S6                           ;接受日数据,放入变量

    MOV AH,0AH

    INT 21H

    MOV DX,OFFSET S7                           ;接受年数据,放入变量

    MOV AH,0AH

    INT 21H

    MOV DL,0DH                                             ;显示回车

    MOV AH,2

    INT 21H

    MOV DL,0AH                                             ;显示换行

    MOV AH,2

    INT 21H

    MOV DX,OFFSET S5                                     ;显示月数据

    ADD DX,2

    MOV AH,9

    INT 21H

    MOV DX,OFFSET S2                                 ;显示‘月’字符

    MOV AH,9

    INT 21H

    MOV DX,OFFSET S6                                     ;显示日数据

    ADD DX,2

    MOV AH,9

    INT 21H

    MOV DX,OFFSET S3                                 ;显示‘日’字符

   MOV AH,9

   INT 21H     

   MOV DX,OFFSET S7                                      ;显示年数据

   ADD DX,2

   MOV AH,9

   INT 21H

   MOV DX,OFFSET S4                                  ;显示‘年’字符

   MOV AH,9

   INT 21H

   MOV AH,4CH                                              ;返回DOS

   INT 21H

CODE ENDS

     END START

结果截图:

2.字符串的匹配设计

为掌握提示信息的设置方法及读取键入信息的方法。编写程序实现两个字符串比较。如相同,则显示“MATCH”,否则,显示“NO MATCH”。

程序清单:

CRLF   MACRO                                                ;显示回车

       MOV   DL,0DH

       MOV   AH,02H

       INT   21H

       MOV   AH,02H

       MOV   DL,0AH

       INT   21H

         ENDM

DATA    SEGMENT

MESS1  DB  'MATCH',0DH,0AH,'$'

MESS2  DB  'NO MATCH',0DH,0AH,'$'

MESS3  DB  'INPUT STRING1!',0DH,0AH,'$'

MESS4   DB  'INPUT STRING2!',0DH,0AH,'$'

MAXLEN1 DB   100

STRING1 DB   100 DUP(?)

MAXLEN2 DB   100

STRING2 DB   100 DUP(?)

DATA    ENDS

CODE    SEGMENT

ASSUME  CS:CODE,DS:DATA,ES:DATA

START:  MOV   AX,DATA

        MOV   DS,AX

        MOV   ES,AX

        MOV   AH,09H

        MOV   DX,OFFSET MESS3

        INT   21H                                      ;显示提示信息1

        MOV   AL,MAXLEN1

        MOV   BX,OFFSET STRING1

        MOV   [BX],AL                                   ;最大字符缓冲

        MOV   AH,0AH

        MOV   DX,OFFSET STRING1

        INT   21H                                 ;接收键入的字符串1

        CRLF

        MOV   AH,09H

        MOV   DX,OFFSET MESS4

        INT   21H                                      ;显示提示信息2

        MOV   AL,MAXLEN2

        MOV   BX,OFFSET STRING2

        MOV   [BX],AL                              ;最大字符缓冲设置

        MOV   AH,0AH

        MOV   DX,OFFSET STRING2

        INT   21H                                 ;接收键入的字符串2

        CRLF

CLD

        LEA   SI,STRING1                        ;字符串1的地址送给SI

        MOV   CL,[SI+1]                       ;字符串1的字符数送给CX

        MOV   CH,0

BEING: LEA   DI,STRING2                        ;字符串2的地址送给DI

        MOV   DL,[DI+1]                       ;字符串2的字符数送给DX

        MOV   DH,0

J1:     MOV   AL,[SI+2]           ;字符串1的第一个字符在字符串2中匹配

        CMP   [DI+2],AL

        JE    J3                                      ;匹配成功则跳转

J2:     INC   DI                               ;指向字符串2下一个字符

        DEC   DX

        JZ    NOMAT                                ;字符串2完,不匹配

        JMP   J1                                 ;字符串2没完,重新匹配

J3:     DEC   CX

        JZ    MATCH                                  ;字符串1完,匹配

        DEC   DX

        JZ    NOMAT                                 ;字符串2完,不匹配

        INC   SI                                   ;指向串1下一个字符

        INC   DI                                   ;指向串2下一个字符

        MOV   AL,[SI+2]

        CMP   [DI+2],AL

        JE    J3                                            ;匹配,跳转

        DEC   DX

        JZ    NOMAT                                ;字符串2完,不匹配

        LEA   SI,STRING1                  ;重新从串1的第一个字符匹配

        MOV   CL,[SI+1]

        MOV   CH,0

        JMP   J1

MATCH:  MOV   AH,09H                                     ;输出匹配信息

        MOV   DX,OFFSET MESS1

        INT   21H             

        JMP   NEXT

NOMAT:  MOV   AH,09H                                  ;输出不匹配信息

        MOV   DX,OFFSET MESS2

        INT   21H             

NEXT:   MOV   AH,4CH                                         ;程序终止

        INT   21H

CODE    ENDS 

END     START

3从键盘输入数据并显示的数据

为掌握接收键盘数据的方法,并了解将键盘数据显示时须转换为ASCII码的原理。编写程序,将键盘接收到的四位十六进制数据转换为等值的二进制数,再显示在终端上。

程序清单:

DATA SEGMENT

MSG1  DB  'Hex:', '$'

MSG2  DB  0DH, 0AH, 'Binary:', '$'

COUNT EQU 4

BUF DB 4 DUP(?)

DATA ENDS

CODE  SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX, DATA

MOV DS, AX

LEA DX, MSG1

MOV AH, 9

INT 21H

MOV CX, COUNT

MOV SI,   0

INPUT:

MOV AH, 1                ;通过四次循环从键盘读入四位十六进制数

INT 21H

 MOV BUF[SI], AL

DEC CX

INC   SI

CMP CX, 0

JNZ INPUT

NEXT3: LEA DX, MSG2

MOV AH, 9

INT 21H

MOV CX, COUNT

MOV SI, 0

NEXT2: MOV BL, BUF[SI]

CMP   BL , '9'         

JBE   OK                             ;读入的字符<=9 转向 OK

SUB   BL,   7                            ;读入字符>= 9   减7

OK:   PUSH   CX

MOV CL ,4   

SHL BL, CL                        ; 逻辑左移4位,低4位à高4位

MOV CX, 4             ; 4次循环将当前处理字符的4位二进制输出

NEXT1: MOV   DL, '0'

SHL   BL, 1

JNC   SKIP   

INC   DL

SKIP: MOV   AH, 2

INT 21H

LOOP   NEXT1

POP CX     ;

INC   SI

LOOP NEXT2 ; 4次循环将4位十六进制数每位转换为对应的4位二进制

EXIT: MOV AH,   4CH

INT   21H

CODE   ENDS

END START

4字符和数据的显示程序

为掌握字符和数据的显示方法。编写程序,先显示信息:INPUT STRING,THE END FLAG IS$,再接收字符。如为0-9,则计数器加1,并显示数据;如为非数字,则直接显示,但不技计数。

程序清单:

CRLF  MACRO

      MOV  AH,02H

      MOV  DL,0DH

      INT  21H

      MOV  AH,02H

      MOV  DL,0AH

      INT  21H

ENDM 

DATA  SEGMENT

MESS1  DB  'INPUT$'

MESS2  DB  'zifu zongshu= $'

MESS3  DB  'no zifu zongshu= $'

MESS4  DB  'shuzi zifu zongshu= $'

TOTAL  DW  ?

DATA   ENDS

STACK  SEGMENT

STA    DW  32 DUP (?)

TOP    DW  ?

STACK  ENDS

CODE   SEGMENT

ASSUME  CS:CODE,DS:DATA,ES:DATA,SS:STACK

START:  MOV  AX,DATA

         MOV  DS,AX

         MOV  ES,AX

         MOV  SP,TOP                                          ;初始化

         MOV  BX,0000H                                     ;计数值清0

         MOV  AH,09H

         MOV  DX,OFFSET MESS1

         INT  21H

         CRLF

XXX:    MOV  AH,01H

         INT  21H                                       ;接收键入字符

         CMP  AL,20H

         JZ   UUU                                    ;是空格键则转UUU

         CMP  AL,0DH

         JNZ  III

         CRLF                                        ;是回车键则转UUU

         JMP  UUU

III:    CMP  AL,30H

        JB   YYY

        CMP  AL,39H

         JBE  VVV                                         ;`0-9`转VVV

YYY:    INC  BX                                           ;计数值加1

VVV:    INC  TOTAL

        JMP  XXX

UUU:    CRLF

         MOV  AH,09H

         LEA  DX,MESS2                                  ;显示字符总数

         INT  21H

         MOV  AX,TOTAL

         CALL DISP

         MOV  AH,02H

         MOV  DL,'H'

         INT 21H

         CRLF                                               ;回车换行

    MOV  AH,09H   

    MOV  DX,OFFSET MESS3

    INT  21H                                      ;显示非数字字符总数

    MOV  AX,BX

    CALL DISP    

    MOV  AH,02H

    MOV  DL,'H'

    INT  21H                                         ;十六进制数标志

    CRLF

    MOV  AH,09H

    LEA  DX,MESS4                                  ;显示数字字符总数

    INT  21H

    MOV  AX,BX

    SUB  TOTAL,AX

    MOV  AX,TOTAL

    CALL DISP

    MOV AH,02H

    MOV DL,'H'

    INT 21H

    MOV  AX,4C00H

    INT  21H

DISPP   PROC NEAR            ;显示子程序,显示AL中的数按十六进制数方式

    MOV  BL,AL                                            ;AL中数送BL

KKK:    MOV  DL,BL

    MOV  CL,04

    ROL  DL,CL

    AND  DL,0FH

    CALL DISPL                                          ;显示字节高位

    MOV  DL,BL

    AND  DL,0FH

    CALL DISPL                                          ;显示字节低位

    RET

DISPP   ENDP

DISPL   PROC NEAR

    ADD  DL,30H                         ;由数值转为参应字符的ASCII码

    CMP  DL,3AH

         JB   DDD                                       ;是0-9转DDD

         ADD  DL,27H                                          ;是A-F

DDD:    MOV  AH,02H

         INT  21H                                     ;显示DL中字符

         RET                                                   ;返回

DISPL   ENDP               ;显示子程序,显示AX中的数按十六进制数方式

DISP    PROC NEAR

         PUSH BX

         PUSH CX

         PUSH DX

         PUSH AX                                            ;入栈保存

         MOV  AL,AH

         CALL DISPP                                       ;显示高字节

         POP AX

         CALL DISPP

         POP  DX

         POP  CX

         POP  BX

         RET                                                   ;出栈

DISP     ENDP

CODE    ENDS

        END     START

四.心得体会:

    经过这次课程设计,跟加深了对汇编语言的理解和认识,尤其是DOS系统的功能调用。这次一共做了4道题目,每一道题都有其难点之处。在做第二道题字符串匹配时就遇到了一些问题。字符串的比较命令需用到DS与ES两个段,而DOS的0A功能只能给DS段,所以还需用到字符串的传送指令,这一点一开始确实忽略了,所以花了不少时间。在做第三个键盘输入数据的设计时,总的思路是不断的比较,一致时再跳入显示环节。遇到的难题是由于JZ指令的跳转范围是-128~127B,而对于输入的数比较的次数较多,导致超出了范围,于是用JMP作为中转,才能实现功能。对于第三道题字符和数据的显示设计,要注意的是由于从键盘上接受的数据是以字符串形式的,所以对于数字的统计需用其对应的ASCII码。对于第一个接受年月日并显示的设计,对年月日的接受还是以字符串的形式。

    总的来说,这次课程设计让我复习了平时忽略的问题,更进一步掌握了DOS以及其他指令的功能调用。编程之前用框图有利于理清思路。对于编程思路,我还是坚持自顶向下的编程方法。这样可以思路清晰,知道已经做到了哪里。还有就是编程需要细心、耐心,或许编程的时候可能比较快,但调试的可能需要更多的时间、和耐心。对于调试的技巧我觉得对于找不出的问题,可以试着将程序分割成几个模块,单独编程进行调试。或许就能找出其中的问题。这次课程设计既动脑又动手,收获很多。

五.参考文献:

1.张荣标,机械工业出版社,《微型计算机原理与接口技术 第二版》

2.张荣标,《微型计算机原理课程设计指导书》

相关推荐