汇编综合实验报告

华北科技学院综合性

实 验 报 告

课程名称        汇 编 语 言                   

实验学期   20##   至  20##   学年 第 1  学期

学生所在系部                                   

年级                  专业班级                  

学生姓名             学号                      

任课教师                             

实验成绩                                      

计算机学院制

《  汇 编 语 言》课程综合性实验报告

开课实验室:基础一                           20##-12-08

一、实验目的

进行汇编语言程序设计应用的综合性训练。综合运用汇编语言循环程序、子程序、宏指令编程方法,提高汇编语言程序设计能力的应用水平。

二、设备与环境

PC兼容机、Windows操作系统、汇编程序masm for windows 2012

三、实验内容

    编制一程序,要求接收从键盘输入的一个班的学生的学号、姓名、成绩,对学生的成绩进行排序,最后把学号、姓名、学生成绩、名次显示出来。

   实验要求:

1.必须画流程图

2.本程序涉及汇编语言的多重循环、子程序及宏,其中 成绩输入、计算学生名次、显示学生名次都分别用子程序,也可用宏处理。

3.要求用菜单选择。具体要求:

输入1是数据录入并输出(包括姓名、学号、成绩);

输入2是排序后的数据输出(包括姓名、学号、成绩、名次);

输入3是可以按学号查找某学生,并输出其成绩,选择修改或不改成绩。

实验结果及分析

 一.程序实现的功能

        (1)学生学号,姓名和成绩的输入和输出。

      (2)学生成绩的排序

      (3)学生成绩的查询及修改        

二.关键代码的分析及解释

(1)菜单提示

       ary  db 10,13,'  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'

               db 10,13,'         @    1.input student number,name,score    @'

              db 10,13,'          @    2.output data                        @'

              db 10,13,'          @    3.pick out student                   @'

              db 10,13,'          @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'

              DB 10,13,'please choose what you want to do?1/2/3','$'

(2)宏定义:

hc macro             ;回车换行宏定义

mov ah,2

    mov dl,13

    int 21h

    mov ah,2

    mov dl,10

    int 21h

    endm

   

kongge macro n        ;空格宏定义

    local

    mov cx,n

lp8:

    mov dl,20h

    mov ah,2

    int 21h

    loop lp8

    endm

 (3)菜单调用 

       mov ah,1 ;-------------------------输入字符比较

    int 21h

    cmp al,'1'

    jz lp1

    cmp al,'2'

    jz lp2

    cmp al,'3'

    jz lp3

    mov ah,9

    mov dx,offset error  ;-----------------错误输出,并返回

    int 21h

    jmp main

(4)输入子程序

    input proc

    mov bx,p

    inc bx

    mov p,bx

    mov ah,9

    lea dx,string1        ;----------------输入姓名并存入buffer1中

    int 21h

    mov ah,10

    lea dx,buffer1

    int 21h

    mov al,buffer1+1

    add al,2

    mov ah,0

    mov si,ax

    mov buffer1[si],0

 let4:

    mov ah,9                ;--------------输入学号存入buffer2中

    lea dx,string2

    int 21h

    mov cx,m

    mov ax,0

    lea di,buffer2+2

    rep stosb

    mov ah,10

    lea dx,buffer2

    int 21h

    mov al,buffer2+1

    mov ah,0

    mov cx,ax

 loop1:

    mov ax,cx

    inc ax

    mov si,ax

    cmp buffer2[si],30h   ;判断输入的数字是否为0~9

    jb let4

    cmp buffer2[si],39h

    ja let4

    loop loop1

    mov al,buffer2+1

    add al,2

    mov ah,0

    mov si,ax

    mov buffer2[si],0

 let5:

    mov dx,offset string3 ;-----------输入成绩存入buffer2中

    mov ah,9

    int 21h

    mov ah,10

    lea dx,buffer3

    int 21h

    mov al,buffer3+1

    mov ah,0

    mov cx,ax

    mov al,buffer3+1

    add al,2

    mov ah,0

    mov si,ax

    mov buffer3[si],0

    hc

    mov dx,offset strput1      ;----------将存入的串输出来

    mov ah,9

    int 21h

    lea dx,buffer1+2

    int 21h

    lea dx,buffer2+2

    int 21h

    lea dx,buffer3+2

    int 21h

    mov mingci[bx-1],bl

    cmp bx,1

    jz let1

    add sign1,n+1      ;--------执行加法指令,计入次数

    add sign2,m+1

    add sign3,l+1

 let1:

    call subr1

    ret

    input endp

(5)排序子程序

     paixu proc

    mov cx,p

    dec cx

    cmp cx,0

    jz exit2

 loop3:

    push cx

    mov bx,0

    mov si,0

 loop2:

    mov ax,score2[bx]

    cmp ax,score2[bx+l+1]

    jge next

    xchg ax,score2[bx+l+1]   ;交换成绩

    mov score2[bx],ax

    mov al,mingci[si]

    xchg al,mingci[si+1]     ;交换名次

    mov mingci[si],al

 next:

    add bx,l+1

    inc si

    loop loop2

    pop cx

    loop loop3

 exit2:

    ret

 paixu endp

菜单流程图:

汇编---学生成绩排序综合实验报告

汇编---学生成绩排序综合实验报告

汇编---学生成绩排序综合实验报告

汇编---学生成绩排序综合实验报告

三.心得体会

  此次程序设计,为学生成绩管理,考虑到难度问题,学生信息为学号,姓名,成绩,只对一门成绩进行管理,包括成绩录入,查询成绩,修改成绩,排序。

    程序主要运用的是子程序的设计与调用以及宏,在调用相应的子程序时,我们运用的是跳转,通过比较的方式,得到相应的结果进行跳转,然后调用子程序。在程序的设计中,设计了菜单,使得程序的界面美观友好,达到使用者操作的时候,感觉简单、清晰。在设计子程序的时候,因为我们是分开进行编程的,所以每一个子程序都是独立的模块。在对子程序的编写时,有的子程序也设计了小菜单,方便用户操作,界面美观。

对于每个子程序的设计遇到了很多的麻烦,例如由于程序设计了大量宏, 当调用宏时,dx连带改变,而这点很容易忽略,最后导致程序运行错误,花了好多时间去解决。另外编号的重复也导致很多错误,以后要注意标号的定义方法,避免重复。

这次的大作业,虽然程序不大,功能也不是很全面,一行一行的敲代码,然后调试,看着调试中每个寄存器值的的变化,突然觉得汇编语言不在那么抽象,可以说通过此次实验我的编程能力都得到了提升。

相关推荐