首页 > 其他 > 详细

汇编综合实验

时间:2019-10-24 19:14:16      阅读:126      评论:0      收藏:0      [点我收藏+]

??????????

#汇编综合实验

汇编综合实验代码书写思路

  • 实验目的:熟练掌握和综合运用顺序结构、分支程序的结构、循环程序结构和子程序结构的编程方法;熟练掌握主程序与子程序之间的调用关系和参数传递方法。
  • 实验要求:利用汇编语言的综合程序结构编制程序
  • 实验内容:功能要求:

    • 功能一:进入时,设计密码输入验证功能;
    • 功能二:键盘输入全班同学( 35 人)的总成绩;
    • 功能三:对全班同学的成绩进行从高到低的排名并在显示器上显示结果;
    • 功能四:统计出不及格的人数并在显示器上输出。
    • 功能五:统计并求出全班的平均成绩,在显示器上输出平均成绩。

实现思路:

  • 1.首先整体构思,需要一个主函数,需要各个分函数
  • 2.分函数有:① 密码验证,② 输入人数,③ 输入成绩,④ 计算总和,⑤ 统计不及格人数,⑥ 计算平均值,⑦ 输出显示
  • 3.根据每一个分函数所需要的内容,再进行每一步的操作步骤

代码编译运行图:

技术分享图片

技术分享图片


实验代码:


DATA    SEGMENT

    PASSWD      DB  '123456$'           ;预设密码
    LEN1        EQU $-PASSWD        ;密码串长度
    WELCOME DB  'Please input password: $'  ;输入密码语句
    TRUE        DB  'Pass !$'
    FALSE       DB  'Password Fail !','$'
    TIP_OF_INPUT    DB  'Please input number of student: $' ;提示输入学生人数
    TIP     DB  'Input Score of Student: $' ;提示输入学生
    STR_OF_STU  DB  256 DUP('$')        ;存放学生人数
    STR     DB  512 DUP('$')        ;学生成绩存放
    PASS        DB  256 DUP('$')        ;输入密码位置
    STR_SCORE   DB  'The student score is $'
    SCORE       DW  50  DUP(0)
    SUM     DW  0
    STR_AVE1    DB  'AVE1= $'
    AVE1        DW  0
    STR_AVE2    DB  'AVE2= $'
    AVE2        DW  0

    STR_UNPASS  DB  'Student unpass number: $'
    SCO_FAIL        DW  0

    STUDENT_NUMBER  DW  5

    DIVI        DW  10000,1000,100,10,1
    RESULT      DB  '00000$'

DATA    ENDS

CODE    SEGMENT
    ASSUME  DS:DATA,CS:CODE
START:
    
MAIN    PROC
    MOV AX,DATA
    MOV DS,AX
    MOV ES,AX
    XOR BX,BX
;------------------------------------------------------比较密码
    CALL    CMPASSWD        ;输入密码
    CMP DX,0
    JZ  EXIT            ;判断密码是否正确
    MOV DX,OFFSET   TRUE
    MOV AH,09H
    INT 21H
    CALL    BACKSPACE
;----------------------------------------密码正确之后
    CALL        INPUT_STUDENT_NUMBER        ;输入学生人数

    CALL        INPUT       ;输入
    CALL        SUMP        ;计算总和
    CALL        AVERAGE     ;计算平均值
    CALL        UNPASS      ;计算不及格人数
    CALL        BUBBLE      ;冒泡算法
    CALL        OUTPUTALL   ;输出 
    
EXIT:   
    MOV AH,4CH
    INT 21H

MAIN    ENDP
;==========================程序段
CMPASSWD        PROC
    
;----------------------------------------输入密码段
AGAIN:  
    LEA DX,WELCOME
    MOV AH,09H
    INT 21H

    LEA DX,PASS
    MOV AH,0AH
    INT 21H
    LEA SI,PASSWD
    LEA DI,PASS+2
    CALL    BACKSPACE
;--------------------------------------------
    
    MOV CX,LEN1-1
    CLD
    REPZ    CMPSB
    JNZ NPAIR
    MOV DL,[DI+1]
    CMP DL,'$'      
    JNZ NPAIR
    MOV DX,1
    RET
NPAIR:  
    INC BX
;--------------------------------------------
    PUSH    CX
    PUSH    BX
    PUSH    SI
    LEA SI,PASS
    MOV CX,255
    MOV BX,'$'
CLEAR:
    MOV [SI],BX
    INC SI  
    LOOP    CLEAR       
    POP SI
    POP BX
    POP CX
;-------------------------------------恢复段
    CMP BX,3
    JNZ AGAIN

    MOV DX,OFFSET   FALSE
    MOV AH,09H
    INT 21H
    MOV DX,0    
    RET
CMPASSWD    ENDP    
;*****************************************以上是密码输入判断段
INPUT_STUDENT_NUMBER    PROC
    XOR BX,BX
    XOR SI,SI
    MOV DX,OFFSET   TIP_OF_INPUT
    MOV AH,09H
    INT 21H
    MOV DX,OFFSET   STR_OF_STU
    MOV AH,0AH
    INT 21H
    
    MOV DL,'$'  
    LEA SI,STR_OF_STU+2
    XOR AX,AX
    
AG:
    MOV     CH,'0'
    CMP     [SI],CH
    JB          RRR
    MOV     CH,'9'
    CMP     [SI],CH
    JA          RRR
    
    MOV BL,BYTE PTR [SI]
    SUB BX,48
    MOV DH,10
    IMUL    DH
    ADD AX,BX

RRR:
    INC SI
    CMP DL,[SI]
    JZ  EXIT2
    JMP AG
EXIT2:
    MOV STUDENT_NUMBER,AX
    CALL    BACKSPACE
    RET
INPUT_STUDENT_NUMBER    ENDP
;++++++++++++++++++++++++以上是输入学生人数段
INPUT       PROC
    MOV     DX,OFFSET   TIP
    MOV     AH,09H
    INT     21H
    
    LEA     DX,STR      ;计算偏移量,放入STR中储存
    MOV     AH,0AH      ;进行输入
    INT     21H

    LEA     SI,STR+2        ;定位字符串                              

    MOV     DH,'$'      ;这里要判断字符串
;结尾
    MOV     DL,' '      ; bx 中放置空格,dx中  
                    ;放置钱符号
    XOR     AX,AX
    XOR     CX,CX
    XOR     DI,DI
LOP:
            
    CMP     DH,[SI]     ;如果到达了字符串结尾,那么结束
    JZ      BREAK
    
    CMP     DL,[SI]         ;如果是空格符号,继续进行加一
    JNZ     OP1
    
    MOV     SCORE[DI],AX
    ADD     DI,2
    XOR     AX,AX
    JMP     CONTINUE
;要不然就判断是否是0-9,如果是,执行以下操作
;-------------------------
OP1:
    
    MOV     CH,'0'
    CMP     [SI],CH
    JB          CONTINUE
    MOV     CH,'9'
    CMP     [SI],CH
    JA          CONTINUE
;以上判断是否是0-9之间的内容,如果是,那么就进行以下内容,如果不是,指针加一
;------------------
    MOV     AH,10
    IMUL        AH
    MOV     CL,[SI]                     ;[SI]移去CL中
    SUB     CL,48                               ;用CL中的内容减去48
    ADD     AL,CL                       ;AL原来有的数值加上CL中的内容
CONTINUE:
    INC     SI
    JMP     LOP

BREAK:
        MOV     SCORE[DI],AX        ;???
        RET

INPUT       ENDP

;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^以上是数据输入转换段
SUMP        PROC
    XOR     AX,AX
    XOR     BX,BX
    XOR     CX,CX
    XOR     DX,DX

    MOV     DX,STUDENT_NUMBER   ;这里为什么不能用
    MOV     SI,0

COUNT:
    ADD     AX,SCORE[SI]
    ADD     SI,2
    DEC     DX
    CMP     DX,0
    JNZ     COUNT

    MOV     SUM,AX

    RET
SUMP        ENDP
;#######################以上是计总和段
BUBBLE  PROC
    XOR AX,AX
    XOR BX,BX
    XOR CX,CX
    XOR DX,DX
    XOR SI,SI
    XOR DI,DI
    MOV SI,0

    MOV CX,STUDENT_NUMBER
;   MOV CX,30           ;输入人数

    DEC CX
OUTER:
    MOV AX,SCORE[SI]
    PUSH        CX
    MOV DI,SI
INNER:
    ADD DI,2
    MOV DX,SCORE[DI]
    CMP AX,DX
        ;   JLE CONT
    JAE CONT
    XCHG    AX,DX   ;交换两个值,AX和DX
    MOV SCORE[SI],AX
    MOV SCORE[DI],DX
CONT:
    LOOP    INNER
    POP CX
    ADD SI,2
    LOOP    OUTER
;基本思想:CX作为循环,内外层都是CX进行循环,第一循环n次,第二次循环n-i次
    RET
BUBBLE  ENDP
;@@@@@@@@@@@@@@@@@@以上是排序段
AVERAGE     PROC
    XOR     AX,AX
    XOR     BX,BX
    XOR     CX,CX
    XOR     DX,DX
    MOV     AX,SUM

    MOV     CX,STUDENT_NUMBER
;   MOV     CX,3            ;需要修改人数

    IDIV        CX          
    MOV     AVE1,AX
    MOV     AVE2,DX
    
    RET
AVERAGE     ENDP
;&&&&&&&&&&&&&&&&&&&&以上是求解均值段
UNPASS  PROC
    XOR BX,BX
    MOV SI,0

;   MOV CX,30   ;人数
    MOV CX,STUDENT_NUMBER

CC:
    CMP     SCORE[SI],60
    JAE     LP  ;60分以下的分数
    INC     BX
LP:
    ADD SI,2
    LOOP    CC
    
    MOV SCO_FAIL,BX
    RET
UNPASS  ENDP
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''以上是计算不及格人数
;----如果是负数,那么输出负号,如果不是,输出正数

OUTPUTAX    PROC
;东西放在AX中,输出AX中的内容
    CMP AX,0
    JGE GO
    PUSH    AX
    MOV DX,'-'
    MOV AH,02H
    INT 21H
    POP AX
    NEG AX
    
GO: MOV SI,OFFSET   DIVI
    MOV DI,OFFSET   RESULT
    MOV CX,5
AA:
    MOV DX,0
    DIV WORD    PTR [SI]
    ADD AL,48
    MOV BYTE    PTR [DI],AL
    INC DI
    ADD SI,2
    MOV AX,DX
    LOOP    AA
    MOV CX,4
    MOV DI,OFFSET   RESULT
BB:
    CMP BYTE    PTR [DI],'0'
    JNE PRINT
    INC DI
    LOOP    BB
PRINT:
    MOV DX,DI
    MOV AH,09H
    INT 21H
    MOV DX,' '
    MOV AH,02H
    INT 21H

    RET
OUTPUTAX    ENDP
;#######################以上是十进制输出显示,放在BX当中
OUTPUTALL   PROC
    ;首先输出学生平均值
    ;然后输出不通过的学生人数
    ;最后输出所有学生成绩     

    MOV CX,STUDENT_NUMBER

    MOV SI,0
    CALL    BACKSPACE
DISPLAY:
    PUSH    CX
    XOR AX,AX
    MOV AX,SCORE[SI]
    PUSH    SI
    CALL    OUTPUTAX
    POP SI
    ADD SI,2
    
    MOV DX,' '
    MOV AH,02H
    INT 21H
    POP CX
    LOOP    DISPLAY     ;输出学生成绩

    CALL    BACKSPACE
;.....................................................................................输出学生所有成绩
    MOV DX,OFFSET   STR_UNPASS
    MOV AH,09H
    INT 21H
    MOV AX,SCO_FAIL
    CALL    OUTPUTAX
    CALL    BACKSPACE
;..........................................................................输出学生不及格人数
    MOV DX,OFFSET   STR_AVE1
    MOV AH,09H
    INT 21H
    MOV AX,AVE1
    CALL    OUTPUTAX
    CALL    BACKSPACE   

    MOV DX,OFFSET   STR_AVE2
    MOV AH,09H
    INT 21H
    MOV AX,AVE2
    CALL    OUTPUTAX
    CALL    BACKSPACE   
;...............................................................................以上输出平均值     
    RET
OUTPUTALL   ENDP
;~~~~~~~~~~~~~~~~~~~输出所有

BACKSPACE   PROC
    PUSH    AX
    PUSH    DX
    
    MOV DX,0DH
    MOV AH,02H
    INT 21H
    MOV DX,0AH
    MOV AH,02H
    INT 21H 

    POP DX
    POP AX
    RET
BACKSPACE   ENDP

;===========================程序代码段

CODE    ENDS
    END START


;功能一:实现密码验证
;功能二:实现输入35人的总成绩
;功能三:对全班同学的成绩从高到低排序并显示输出
;功能四:统计不及格人数并显示输出
;功能五:求出全班平均成绩并显示输出

;STR_SCORE  DB  'The student score is $'
;STR_AVE1   DB  'AVE1= $'
;STR_AVE2   DB  'AVE2= $'
;STR_UNPASS DB  'Student unpass number: $'
;SCO_FAIL   DB  0

  • 有错误之处欢迎指出
  • 如果有更好的思路请指教

汇编综合实验

原文:https://www.cnblogs.com/Yunrui-blogs/p/11733916.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!