微机原理课程设计

最近在做一个微机原理的课程设计,用汇编实现一定的功能,题目比较简单,思路也有很多种,放上我的思路和代码供大家参考
1,题目:十六进制数转换为二进制数设计
1.1设计要求:设计转换程序,将键盘输入的四位十六进制数据转换为等值的二进制数,并在终端显示。完善程序结构,设置程序错误出口。输入的不是0-F间的值,显示错误提示信息,并要求重新输入。
1.2设计思路
DOS1号功能调用,输入字符并回显,数据在AL中,将AL存在BX中,BX左移4位,接着输入下一个字符,存在BX中,输入4次。通过逻辑左移指令将BX中每一位依次移到CF,将CF中的内容送到DL,DOS2号功能调用,显示DL中的内容,循环16次,最后输出符号B。
1.3程序清单

;第一题:输入四位十六进制数,输出其对应的二进制数,输入空格则退出程序
DATA SEGMENT
        TIP DB 'INPUT A NUMBER: ',0AH,0DH,'$' 
        ERROR DB 0AH,'ERROR!!!',0AH,0DH,'PLEASE INPUT AGAIN:','$' 
        TIP1 DB 0DH,0AH,'INPUT A NUMBER:','$';回车换行 
DATA    ENDS
CODE    SEGMENT
        ASSUME CS:CODE,DS:DATA
START:  MOV AX,DATA
        MOV DS,AX   	
        LEA DX,TIP ;DISPLAY 'INPUT A NUMBER:'
        MOV AH,09H
        INT 21H                                                                                    
        MOV CH,4 ;记录输入数字次数
        MOV CL,4 ;一次左移位数
        MOV BX,0 ;记录左移之后的数字
        MOV DH,16 ;输出十六位二进制数字控制   
INPUT:  MOV AH,1
	    INT 21H
        CMP AL,20H
        JZ  EXIT
	    CMP AL,30H;<0?
	    JB  AA 
	    CMP AL,39H;>9?
	    JA  COMPER1 
	    JMP CHANGE1;0-9
COMPER1:CMP AL,41H ;<A?
	    JB  ERROR1 
	    CMP AL,46H ;>F?
	    JA  COMPER2 
	    JMP CHANGE2 ;A-F
COMPER2:CMP AL,61H ;<a?
	    JB  ERROR1 
	    CMP AL,66H ; >f?
	    JA  ERROR1 
	    JMP CHANGE3 ; a-f
CHANGE1:SUB AL,30H ;转换成0-9
	    SHL BX,CL ;左移四位 
	    OR  BL,AL ; 进行或运算得到四位二进制
	    DEC CH ; 输入数字次数自减1
	    JZ  ENT ; 四位十六进制全部输入完毕则打印,否则继续输入
	    JMP INPUT 
CHANGE2:SUB AL,37H ;A-F<=>0AH,0BH...0FH
	    SHL BX,CL
	    OR  BL,AL
	    DEC CH
	    JZ  ENT
	    JMP INPUT
CHANGE3:SUB AL,57H ;a-f<=>0AH,0BH...0FH
	    SHL BX,CL
	    OR  BL,AL
	    DEC CH
	    JZ  ENT
	    JMP INPUT
ENT:    MOV DL, 0DH ;
	    MOV AH, 02H ;输出单个字符
	    INT 21H ;输出.
	    MOV DL, 0AH ;0A是换行符的ASCII码
	    MOV AH, 02H
	    INT 21H 	
	    JMP DISPLAY
DISPLAY:SHL BX,1
	    PUSH CX
	    MOV CL,30H
	    ADC CL,0
	    MOV DL,CL ;输出CF中的内容
	    POP CX
	    MOV AH,02H
	    INT 21H
	    DEC DH
	    JZ  AA
	    JMP DISPLAY
ERROR1: LEA DX,ERROR ;DISPLAY ERROR
        MOV AH,09H
        INT 21H        
        MOV CH,4 
        MOV CL,4 
        MOV BX,0 
        MOV DH,16	
        JMP INPUT         
AA:     MOV DL,42H
        MOV AH,02H
        INT 21H
        LEA DX,TIP1
        MOV AH,09H
        INT 21H
        MOV CH,4 
        MOV CL,4 
        MOV BX,0
        MOV DH,16 
        JMP INPUT
EXIT:   MOV AH,4CH
        INT 21H
CODE    ENDS
        END START

1.4程序运行结果及分析
在这里插入图片描述输入的是0—F的话,输出其对应的二进制代码,输入其他的话输出错误信息,输入完毕后按空格键退出程序。
2,题目:十六进制转换为十进制数设计
2.1设计要求:设计转换程序,将键盘输入的一位十六进制数据转换为等值的二进制数,并在终端显示。完善程序结构,设置程序错误出口。输入的不是0-F间的值,显示错误提示信息,并要求重新输入。
2.2设计思路
DOS1号功能调用,输入字符并回显,数据在AL中,将AL与0—9的ASCII码比较,小于30H则提示错误,大于39H则和A—F的ASCII码比较,小于41H则提示错误,大于46H则和a—f的ASCII码比较,小于61H则提示错误,大于66H也提示错误。0—9则先显示0,将0送到DL,DOS2号功能调用,显示DL中的内容,然后显示其对应的字符。A—F则先显示1,将将0送到DL,DOS2号功能调用,显示DL中的内容,然后输出A—F减10后对应的字符。a—f则先显示1,将将0送到DL,DOS2号功能调用,显示DL中的内容,然后输出a—f减10后对应的字符。
2.3程序清单

;第二题:输入十六进制数,输出其所对应的十进制数,输入空格则退出程序
DATA    SEGMENT
	    TIP DB 'INPUT A NUMBER:','$'
	    TIP1 DB '  <=>  ','$'
	    TIP2 DB 0AH,'ERROR!!!','$'
	    TIP3 DB 0DH,0AH,'INPUT A NUMBER:','$';回车换行
DATA    ENDS

CODE    SEGMENT
	    ASSUME CS:CODE,DS:DATA
START:  MOV AX,DATA
	    MOV DS,AX
	    LEA DX,TIP
	    MOV AH,09H
	    INT 21H

INPUT:  MOV AH,1
	    INT 21H
	    CMP AL,20H
	    JZ  EXIT
	    CMP AL,30H
	    JB  ERROR
	    CMP AL,39H
        JA  COMPER1
	    JMP CHANGE1    ;0-9
COMPER1:CMP AL,41H
	    JB  ERROR
	    CMP AL,46H
	    JA  COMPER2
	    JMP CHANGE2    ;A-F
COMPER2:CMP AL,61H
	    JB  ERROR
	    CMP AL,66H
	    JA  ERROR
	    JMP CHANGE3    ;a-f

CHANGE1:SUB AL,30H
	    JMP ENT
CHANGE2:SUB AL,37H
	    JMP ENT
CHANGE3:SUB AL,57H
	    JMP ENT
ENT:    MOV BL,AL
	    LEA DX,TIP1
	    MOV AH,09H
	    INT 21H
	    MOV AL,BL
	    MOV AH,0
	    MOV BL,10
	    DIV BL
	    MOV DH,AH
	    CMP AL,0
	    JE  ONE
	    MOV DL,AL      ;十位数是1
	    ADD DL,30H
	    MOV AH,02H
	    INT 21H
ONE:	MOV DL,DH      ;十位数是0
	    ADD DL,30H
	    MOV AH,02H
	    INT 21H

AA:     LEA DX,TIP3
        MOV AH,09H
        INT 21H
        JMP INPUT
	
ERROR:  LEA DX,TIP2
        MOV AH,09H
        INT 21H 
        JMP AA
EXIT:   MOV AH,4CH
        INT 21H
CODE    ENDS
        END START

2.4程序运行结果及分析在这里插入图片描述
输入0—F输出其所对应的十进制数,输入其他字符则提示错误信息,输入完毕后按空格键退出程序。
3, 题目:十六进制数转换为ASCⅡ码
3.1设计要求:设计转换程序,将键盘输入的十六进制数据转换为对应的ASCⅡ码,并在终端显示。
3.2设计思路
DOS1号功能调用,输入字符并回显,数据在AL中,若AL小于30H,则提示错误。若AL大于39H,则与41H对比,小于则提示错误。AL与46H对比,大于则和61H对比,小于则提示错误。AL大于66H提示错误。AL在 0—9中则先显示3,,再显示AL中的内容。AL在A—F中则先显示4,再显示A—F减10对应的字符。AL在a—f则先显示6,再显示a—f减10对应的字符。最后显示H。
3.3程序清单

;第三题:输入十六进制数,输出其对应的ASCII码,输入空格则退出程序
DATA    SEGMENT
	    TIP DB 'INPUT A NUMBER:','$'
	    TIP1 DB '  <=>  ','$'
	    TIP2 DB 0AH,'ERROR!!!',0DH,0AH,'PLEASE INPUT AGAIN:','$' 
	    TIP3 DB 0DH,0AH,'$';回车换行
DATA    ENDS

CODE    SEGMENT
	    ASSUME CS:CODE,DS:DATA
START:  MOV AX,DATA
	    MOV DS,AX
	    LEA DX,TIP
	    MOV AH,09H
	    INT 21H

INPUT:  MOV AH,1
	    INT 21H                
	    CMP AL,20H
	    JZ  EXIT
	    CMP AL,30H
	    JB  ERROR
	    CMP AL,39H
        JA  COMPER1
	    JMP CHANGE1    ;在0-9之间
COMPER1:CMP AL,41H
	    JB  ERROR
	    CMP AL,46H
	    JA  COMPER2
	    JMP CHANGE2    ;在A-F之间
COMPER2:CMP AL,61H
	    JB  ERROR
	    CMP AL,66H
	    JA  ERROR
	    JMP CHANGE3    ;在a-f之间

CHANGE1:SUB AL,30H
	    JMP ENT
CHANGE2:SUB AL,36H
	    JMP ENT
CHANGE3:SUB AL,56H
	    JMP ENT
ENT:    MOV BL,AL
	    LEA DX,TIP1
	    MOV AH,09H
	    INT 21H
	    MOV AL,BL
	    MOV AH,0
	    MOV BL,10
	    DIV BL
	    MOV DH,AH
	    CMP AL,0
	    JE  ONE
	    MOV AL,4
	    MOV DL,AL      ;4   A-F    40H-45H
	    ADD DL,30H
	    MOV AH,02H
	    INT 21H
	    JMP AA
ONE:	MOV AL,3       ;0-9   30H-39H
        MOV DL,AL
        ADD DL,30H
        MOV AH,02H
        INT 21H
AA:     MOV DL,DH      ;输出个位
	    ADD DL,30H
	    MOV AH,02H
	    INT 21H
        MOV DL,48H
        INT 21H
        LEA DX,TIP3
        MOV AH,09H
        INT 21H
        
        LEA DX,TIP
	    INT 21H
        JMP INPUT 
	
ERROR:  LEA DX,TIP2
        MOV AH,09H
        INT 21H 
        JMP INPUT
EXIT:   MOV AH,4CH
        INT 21H 
CODE    ENDS
        END START

3.4程序运行结果及分析
在这里插入图片描述
输入0—F的话,输出其对应的ASCII码,输入其他字符的话,输出错误信息,输入完毕后按空格键退出。
4,题目:英文字母大小写转换设计
4.1设计要求:英文字母大小写转换本质上是ASCⅡ码直接的转换。要求掌握大小写字母在计算机内的表示方法以及转换方法。设计程序,连续将键盘输入的小写字母转为大写字母,并在终端显示。小写字母转换为大写字母输出,非字母或大写字母输入,不做处理直接输出。
4.2设计思路
DOS1号功能调用,输入字符并回显。AL若在41H—5AH中,则送AL+20H到DL,DOS2号功能调用输出字符。AL若在61—7AH中,则送AL-20H到DL,DOS2号功能调用输出字符。其他情况不作处理直接送AL到DL,DOS2号功能调用输出字符。
4.3程序清单

;第四题:a-z则转换为A-Z输出,A-Z则转换为a-z输出
;        其他情况直接输出所输入的符号
;        输入空格则退出程序
DATA    SEGMENT
	    TIP DB 'INPUT A NUMBER: ','$'
	    TIP1 DB '  <=>  ','$'
	    TIP2 DB 0AH,0DH,'PLEASE INPUT A NUMBER:','$'
DATA    ENDS

CODE    SEGMENT
	    ASSUME CS:CODE,DS:DATA
START:  MOV AX,DATA
	    MOV DS,AX
	    LEA DX,TIP;DISPLAY 'INPUT A NUMBER:'
	    MOV AH,09H
	    INT 21H

INPUT:  MOV AH,1
	    INT 21H 
	    CMP AL,20H
	    JZ  EXIT
	    CMP AL,41H
	    JB  DISPLAY
	    CMP AL,5AH
        JA  COMPER1
	    JMP CHANGE1    ;A-Z
COMPER1:CMP AL,61H
	    JB  DISPLAY
	    CMP AL,7AH
	    JA  DISPLAY
	    JMP CHANGE2    ;a-z

CHANGE1:ADD AL,20H
	    JMP DISPLAY
CHANGE2:SUB AL,20H
	    JMP DISPLAY
	    
DISPLAY:MOV BL,AL
        LEA DX,TIP1
        MOV AH,09H
        INT 21H
        MOV AL,BL
        MOV AH,0
        MOV DL,AL
        MOV AH,02H
        INT 21H
        
        LEA DX,TIP2
        MOV AH,09H
        INT 21H	
        JMP INPUT 
            
EXIT:   MOV AH,4CH
        INT 21H	    	
CODE    ENDS
        END START

4.4程序运行结果及分析
在这里插入图片描述
输入的是A—Z或a—z则输出其对应的小写,大写字母,输入的是其他字符的话,不作处理直接输出,输入完毕后按空格键退出程序。
5,题目:计算S=1+23+34+45+…+N(N+1)
5.1 设计要求:设计程序实现S=1+23+34+45+…+N(N+1)的算法。数值N由键盘输入,计算结果显示终端输出。计算结果不超出16位寄存器存储能力,如有溢出提示错误。
5.2 设计思路
SUM初始化为1,输入数字,以回车键结束,最终输入的字符在CX中,N=CX+1,N1=2,N1=N?相等则显示SUM中的内容,不等则AX=N1*(N1+1),SUM=SUM+AX,N1=N1+1 重新判断N1=N?直到相等,输出SUM中的值。如果运算过程中有溢出,则提示溢出错误。
5.3 程序清单

;第五题:计算S=1+2×3+3×4+...+N(N+1)
DATA    SEGMENT
        TIP1  DB  0DH,0AH,'PLEASE INPUT A NUMBER:','$'
        TIP2  DB  0DH,0AH,'SUM=','$'
        TIP3  DB  0DH,0AH,'OVER!','$'
        TIP4  DB  0DH,0AH,'PRESS ANY KEY TO EXIT',0DH,0AH,'$'
        N   DW  ?
        N1  DW  2
        SUM DW  1
DATA    ENDS
CODE    SEGMENT
        ASSUME  CS:CODE, DS:DATA
START:  MOV   AX, DATA
        MOV   DS, AX
        LEA   DX, TIP1;DISPLAY TIP1
        MOV   AH, 9
        INT   21H
        CALL  INPUT
        ;CMP   CX, 1
        ;JB    EXIT
        INC   CX
        MOV   N, CX;N=CX+1     
L_ADD:  MOV   AX, N1
        CMP   AX, N
        JE    DISPLAY
        INC   N1
        MUL   N1
        CMP   DX, 0
        JNZ   OVER
        ADD   SUM, AX
        JC    OVER
        JMP   L_ADD
DISPLAY:LEA   DX, TIP2
        MOV   AH, 9
        INT   21H
        MOV   AX, SUM
        CALL  PRINT
        JMP   EXIT
OVER:   LEA   DX, TIP3
        MOV   AH, 9
        INT   21H
        JMP   EXIT
INPUT:  MOV   BL, 10
        MOV   CX, 0
IN_NUM: MOV   AH, 7
        INT   21H
        CMP   AL, 13;与回车符号比较,相等则退出
        JE    IN_END
        CMP   AL, '0'
        JB    IN_NUM
        CMP   AL, '9'
        JA    IN_NUM
        MOV   DL, AL
        MOV   AH, 2;DISPLAY AL 
        INT   21H        
        MOV   AL, DL
        SUB   AL, 30H;ASCII CODE ->NUM
        MOV   AH, 0
        XCHG  AX, CX
        MUL   BL
        ADD   CX, AX;输入的数存在CX中
        JMP   IN_NUM
IN_END: RET;INPUT END
PRINT:  MOV   BX, 10
        MOV   CX, 0
OL1:    MOV   DX, 0
        DIV   BX
        ADD   DL, '0'
        PUSH  DX
        INC   CX
        CMP   AX, 0
        JNZ   OL1
        MOV   AH, 2
OL2:    POP   DX
        INT   21H
        LOOP  OL2
        RET
EXIT:   LEA   DX, TIP4
        MOV   AH, 9
        INT   21H
        MOV   AH, 7
        INT   21H
        MOV   AH, 4CH
        INT   21H
CODE    ENDS
        END  START

5.4 程序运行结果及分析
在这里插入图片描述输入数字,以回车结束,输出其对应的值,如果溢出则显示OVER!。
6、题目:计算N!
6.1 设计要求:数值N由键盘输入,计算结果在显示终端输出。N的范围为0-65535,即不超出16位寄存器的存储量。
6.2 设计思路
输入数字以回车结束,最终结果在CX中,N=CX,AX=N,N=N-1,N=1?相等则显示AX中的内容,不等则AX=AX*N,N=N-1,N=1?循环,直到N=1,最后显示AX中的内容。如果运算过程中有溢出,则提示溢出错误。
6.3 程序清单

;第六题:输入N,输出N!的值
DATA    SEGMENT
        TIP1  DB  0DH,0AH,'PLEASE INPUT A NUMBER:','$'
        TIP2  DB  0DH,0AH,'N!=','$'
        TIP3  DB  0DH,0AH,'OVER!','$'
        TIP4  DB  0DH,0AH,'PRESS ANY KEY TO EXIT','$'
        N     DW  ?
DATA    ENDS

CODE    SEGMENT
        ASSUME  CS:CODE, DS:DATA
START:  MOV     AX, DATA
        MOV     DS, AX
        LEA     DX, TIP1;DISPLAY TIP1
        MOV     AH, 9
        INT     21H

        CALL    INPUT
        CMP     CX, 1
        JB      EXIT
        MOV     N, CX

        MOV     AX, N
L_MUL:  DEC     N
        CMP     N,1
        JE      DISPLAY        
        MUL     N;(AX)=N*(N-1)
        JC      OVER
        JMP     L_MUL

DISPLAY:PUSH    AX
        LEA     DX, TIP2
        MOV     AH, 9
        INT     21H
        POP     AX
        CALL    OUTPUT
        JMP     EXIT

OVER:   LEA     DX, TIP3
        MOV     AH, 9
        INT     21H

EXIT:   LEA     DX, TIP4
        MOV     AH, 9
        INT     21H
        MOV     AH, 7
        INT     21H
        MOV     AH, 4CH
        INT     21H       ;返回DOS
INPUT:  MOV     BL, 10
        MOV     CX, 0
IN_NUM: MOV     AH, 7
        INT     21H
        CMP     AL, 13;与回车符号比较,相等则退出
        JE      IN_END
        CMP     AL, '0'
        JB      IN_NUM
        CMP     AL, '9'
        JA      IN_NUM
        MOV     DL, AL
        MOV     AH, 2;DISPLAY AL 
        INT     21H
        
        MOV     AL, DL
        SUB     AL, 30H;ASCII CODE ->NUM
        MOV     AH, 0
        XCHG    AX, CX
        MUL     BL
        ADD     CX, AX
        CMP     CH, 0
        JNZ     IN_END
        JMP     IN_NUM

IN_END: RET;INPUT END

OUTPUT: MOV     BX, 10
        MOV     CX, 0
OL1:    MOV     DX, 0
        DIV     BX
        ADD     DL, '0'
        PUSH    DX
        INC     CX
        CMP     AX, 0
        JNZ     OL1
        MOV     AH, 2
OL2:    POP     DX
        INT     21H
        LOOP    OL2
        RET
CODE    ENDS
        END  START

6.4 程序运算结果及分析
在这里插入图片描述输入数字,输出其对应的阶乘,如果结果溢出,则输出OVER!。
7、题目:排序设计
7.1 设计要求:要求掌握用汇编语言编写排序程序的思路和方法。设计程序,从屏幕上输入任意两位及以下的数值,以空格或“,”分割输入数字,要求设计算法将这些数由小到大升序排列,排列后的数仍然存放在该内存区域中。
7.2 设计思路
输入8个数字,每个数字以回车结尾,先输出未排序时的数据,然后采用冒泡法排序,从第一个数开始依次与后一个数比较,小于则不变,大于则交换。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。排序完成后输出数据。
7.3 程序清单

;第七题:输入8个数字,从小到大排序
DATA    SEGMENT
        BUFF  DW  8 DUP(?)
        FLAG  DB  8
        FLAG1 DB  0
        TIP1  DB  0DH,0AH,'PLEASE INPUT 8 NUMBERS:',0DH,0AH,'$'
        TIP2  DB  0DH,0AH,'BEFORE SORT:','$'
        TIP3  DB  0DH,0AH,'AFTER SORT:','$'
        TIP4  DB  0DH,0AH,'PRESS ANY KEY TO EXIT','$'
        TIP5  DB  0DH,0AH,'$'
DATA    ENDS
CODE    SEGMENT
        ASSUME  CS:CODE,DS:DATA
START:  MOV     AX,DATA
        MOV     DS,AX
        MOV     SI,OFFSET BUFF
        LEA     DX,TIP1;DISPLAY TIP1
        MOV     AH,9
        INT     21H
        MOV     FLAG,8
BUF:    CALL    INPUT
        CMP     CX, 1
        JB      EXIT
        MOV     [SI], CX;SAVE NUMBER
        ADD     SI,2
        PUSH    AX
        PUSH    DX
        LEA     DX,TIP5
        MOV     AH,9
        INT     21H
        POP     DX
        POP     AX
        DEC     FLAG
        CMP     FLAG,0
        JNZ     BUF 
        
        LEA     DX,TIP2;DISPLAY TIP2
        MOV     FLAG1,16
        CALL    DISPLAY;DISPLAY原数据        
        CALL    COMPARE
        LEA     DX,TIP3 
        MOV     FLAG1,16
        CALL    DISPLAY;DISPLAY排序后的数据
        JMP     EXIT
INPUT:  MOV     BL, 10
        MOV     CX, 0
IN_NUM: MOV     AH, 7
        INT     21H
        CMP     AL, 13;与回车符号比较,相等则退出
        JE      IN_END
        CMP     AL, '0'
        JB      IN_NUM
        CMP     AL, '9'
        JA      IN_NUM
        MOV     DL, AL
        MOV     AH, 2;DISPLAY AL 
        INT     21H
        
        MOV     AL, DL
        SUB     AL, 30H;ASCII CODE ->NUM
        MOV     AH, 0
        XCHG    AX, CX
        MUL     BL
        ADD     CX, AX
        JMP     IN_NUM
IN_END: RET;INPUT END 
                
COMPARE:MOV     CX,8
        DEC     CX
LOP1:   MOV     DX,CX
        MOV     SI,OFFSET BUFF
        ;MOV     BX,0
LOP2:   MOV     AX,[SI]
        CMP     AX,[SI+2]
        JBE     CONTI;[SI]≤[SI+2]则跳转
        XCHG    AX,[SI+2]
        MOV     [SI],AX
CONTI:  ADD     SI,2
        LOOP    LOP2
        MOV     CX,DX
        LOOP    LOP1
        RET
DISPLAY:MOV   AH, 09H
        INT   21H
        LEA   SI, BUFF
        MOV   CX, 8
DL1:    MOV   AX, [SI]
        CALL  PRINT
        ADD   SI, 2
        LOOP  DL1
        RET

PRINT:  MOV   BX, 10
        PUSH  CX
        MOV   CX, 0
ZH1:    MOV   DX, 0
        DIV   BX
        ADD   DL, '0'
        PUSH  DX
        INC   CX
        CMP   AX, 0
        JNZ   ZH1
        MOV   AH, 2
ZH2:    POP   DX
        INT   21H
        LOOP  ZH2
        MOV   DL, ' '
        INT   21H
        POP   CX
        RET
 
EXIT:   MOV     AH,4CH
        INT     21H 

CODE    ENDS
        END START

7.4 程序运算结果及分析
在这里插入图片描述输入8个数字,每个数字以回车结尾,输入完毕后输出排序前后的数组。
8、题目:学生成绩名次表设计
8.1 设计要求:设计程序,将分数在1~100之间的10个成绩存入数据段首地址为0000H的单元中,0000H+i表示学号为i的学生成绩。编写程序,将排出的名次表放在0100H开始的数据区,0100H+i中存放学号为i的学生名次。
8.2 设计思路
输入10个学生的成绩,每个成绩都以回车结尾,存在SCORE中,初始化INDEX,给INDEX依次赋值,1—10。运用冒泡法对SCORE中的数据进行排序,依次输出SCORE和INDEX中的内容,每输出一个SCORE,输出一个INDEX,循环10次。
8.3程序清单

;第八题:输入10个学生成绩,排序后输出
DATA SEGMENT
        ;ORG 0000H
        SCORE   DW  10 DUP(0) 
        ;ORG 0100H
        INDEX   DW  10 DUP(0)
        FLAG    DW  10 
        FLAG1   DW  10
        TIP1    DB  0DH,0AH,'PLEASE ENTER 10 STUDENT SCORE: ',0DH,0AH ,'$'
        TIP2    DB  0DH,0AH,'PAIMING: ',0DH,0AH, '$' 
        TIP3    DB  0DH,0AH, '$'
        TIP4    DB  '   RANKING   ','$' 
DATA    ENDS
CODE    SEGMENT
        ASSUME  CS:CODE, DS:DATA
START:  MOV     AX, DATA
        MOV     DS, AX
        LEA     DX, TIP1;DISPLAY TIP1
        MOV     AH, 9
        INT     21H
        MOV     SI,OFFSET SCORE
        ;MOV     DI,OFFSET SCORE1
BUF:    CALL    INPUT
        CMP     CX, 1
        JB      EXIT
        MOV     [SI], CX;SAVE NUMBER 
        ;MOV     [DI], CX
        ADD     SI,2
        ;ADD     DI,2
        PUSH    AX
        PUSH    DX
        LEA     DX,TIP3;回车换行
        MOV     AH,9
        INT     21H
        POP     DX
        POP     AX
        DEC     FLAG1
        CMP     FLAG1,0
        JNZ     BUF 
        
        LEA     DX,TIP3;回车换行
        MOV     AH,9
        INT     21H
             
        PUSH    CX
        PUSH    DX
        PUSH    AX   
        MOV     CX,FLAG
        MOV     DX,1
        MOV     SI,OFFSET INDEX;INDEX初始化
INIT:   MOV     [SI],DX 
        ADD     SI,2
        ADD     DX,1
        LOOP    INIT
        POP     AX
        POP     DX
        POP     CX      
        CALL    SORT
        CALL    DISPLAY
        JMP     EXIT
        
        
INPUT:  MOV     BL, 10
        MOV     CX, 0
IN_NUM: MOV     AH, 7
        INT     21H
        CMP     AL, 13;与回车符号比较,相等则退出
        JE      IN_END
        CMP     AL, '0'
        JB      IN_NUM
        CMP     AL, '9'
        JA      IN_NUM
        MOV     DL, AL
        MOV     AH, 2;DISPLAY AL 
        INT     21H        
        MOV     AL, DL
        SUB     AL, 30H;ASCII CODE ->NUM
        MOV     AH, 0
        XCHG    AX, CX
        MUL     BL
        ADD     CX, AX
        JMP     IN_NUM
IN_END: RET;INPUT END 
       
SORT:   MOV     CX, FLAG
        DEC     CX
S0:     PUSH    CX
        LEA     SI, SCORE          
S1:     MOV     AX, [SI]
        CMP     AX, [SI + 2]
        JA      S3
        XCHG    AX, [SI + 2]
        MOV     [SI],AX
S3:     ADD     SI, 2
        LOOP    S1
        POP     CX
        LOOP    S0
        RET

DISPLAY:LEA     SI, SCORE
        LEA     DI, INDEX
        MOV     CX, FLAG
DL1:    MOV     AX, [SI]
        CALL    PRINT
        ADD     SI, 2
        
        LEA     DX,TIP4
        MOV     AH,9
        INT     21H
        
        MOV     AX, [DI]
        CALL    PRINT1
        ADD     DI,2
       
        LEA     DX,TIP3
        MOV     AH,9
        INT     21H
        
        LOOP    DL1
        RET

PRINT:  MOV     AX, [SI]
        MOV     BX, 10
        PUSH    CX
        MOV     CX, 0
ZH1:    MOV     DX, 0
        DIV     BX
        ADD     DL, '0'
        PUSH    DX
        INC     CX
        CMP     AX, 0
        JNZ     ZH1
        MOV     AH, 2
ZH2:    POP     DX
        INT     21H
        LOOP    ZH2
        MOV     DL, ' '
        INT     21H
        POP     CX
        RET
        
PRINT1: MOV     AX, [DI]
        MOV     BX, 10
        PUSH    CX
        MOV     CX, 0
ZH01:   MOV     DX, 0
        DIV     BX
        ADD     DL, '0'
        PUSH    DX
        INC     CX
        CMP     AX, 0
        JNZ     ZH01
        MOV     AH, 2
ZH02:   POP     DX
        INT     21H
        LOOP    ZH02
        MOV     DL, ' '
        INT     21H
        POP     CX
        RET
EXIT:   MOV     AH, 4CH
        INT     21H
CODE    ENDS
        END START

8.4 程序运算结果及分析
在这里插入图片描述输入10个学生的成绩,输出其成绩对应的名次。
9、题目:字符串匹配设计
9.1 设计要求:用第一个字符串的第一个字符和第二个字符串的每一个字符相比较,如相同则显示“MATCH”,不相同则用第一个字符串的第二个字符和第二个字符串的所有字符比较,如此比较直至结束。
9.2 设计思路
输入两个字符串到缓冲区,运用CLD;REPZ CMPSB;以地址递增的形式进行字符串比较,相等则输出MATCH,不等则输出NOT MATCH。
9.3程序清单

;第九题:输入两个字符串进行比较,若相等则输出MATCH,不等则输出NOT MATCH
DATA    SEGMENT
        TIP1   DB  0DH,0AH, 'PLEASE INPUT STRING1 END BY ENTER:' ,'$'
        TIP2   DB  0DH,0AH, 'PLEASE INPUT STRING1 END BY ENTER:' ,'$'
        TIP3   DB  0DH,0AH, 'MATCH','$'
        TIP4   DB  0DH,0AH, 'NOT MATCH','$'
        TIP5   DB  0DH,0AH, 'PRESS ENTER TO EXIT      ','$' 
        BUFF1  DB  101,0,101 DUP(0)
        BUFF2  DB  101,0,101 DUP(0)
DATA    ENDS

CODE    SEGMENT
        ASSUME  CS:CODE,DS:DATA 
        
START:  MOV AX,DATA
        MOV DS,AX
        MOV ES,AX;数据段和堆栈段初始化
              
        LEA DX,TIP1             
        MOV AH,9
        INT 21H;DISPLAY TIP1
        LEA DX,BUFF1
        MOV AH,0AH
        INT 21H;输入第一个字符串到BUFF1缓冲区
        
        LEA DX,TIP2
        MOV AH,9
        INT 21H
        LEA DX,BUFF2
        MOV AH,0AH
        INT 21H;输入第二个字符串到BUFF2缓冲区
   
        LEA SI,BUFF1;第一个字符串首址给SI
        LEA DI,BUFF2;第二个字符串首址给DI
        MOV CX,53
        CLD;地址递增             
        REPZ CMPSB;字符串比较
        JZ  MATCH;相等输出MATCH
        LEA DX,TIP4
        MOV AH,9
        INT 21H;不等输出NOT MATCH
        JMP EXIT        
MATCH:  LEA DX,TIP3
        MOV AH,9
        INT 21H;DISPLAY TIP1
        JMP EXIT
EXIT:   LEA DX,TIP5
        MOV AH,9
        INT 21H
        MOV AH,1
        INT 21H
        CMP AL,13
        JZ  AA
        JMP START
AA:     MOV AH,4CH
        INT 21H	
CODE    ENDS
        END     START 

9.4 程序运算结果及分析
在这里插入图片描述输入两个字符串,如果两个字符串每一位都相等的话,则显示MATCH,如果不等,则显示NOT MATCH,显示完毕后按回车键退出。
10
程序清单

DATA    SEGMENT
        TIP1  DB  0DH,0AH,'INPUT STRING,THE END FLAG IS $', '$' 
        TIP2  DB  0DH,0AH,'STRING LENGTH IS:','$'
        TIP3  DB  0DH,0AH,'NUM OF STRING IS:','$' 
        TIP4  DB  0DH,0AH,'$' 
        TIP5  DB  0DH,0AH, 'PRESS ENTER TO EXIT      ','$'
        N1    DW  0
        N2    DW  0
DATA    ENDS

CODE    SEGMENT
        ASSUME  CS:CODE,DS:DATA
        
START:  MOV AX,DATA
        MOV DS,AX
        MOV ES,AX;数据段堆栈段初始化
        LEA DX,TIP1
        MOV AH,9
        INT 21H;OUTPUT STRING
        MOV DX,'$';DISPLAY $
        MOV AH,2
        INT 21H
        MOV DX,3AH;DISPLAY :
        MOV AH,2
        INT 21H
        LEA DX,TIP4;回车换行
        MOV AH,9
        INT 21H            
        MOV N1,0;存放字母的个数
        MOV N2,0;存放数字的个数        
INPUT:  MOV AH,1;输入字符 
        INT 21H
        CMP AL,'$'
        JZ  INEND
        CMP AL,'z'
        JA  INPUT                   
        CMP AL,'a'
        JAE ABC;输入为a--z,SI加1
        CMP AL,'Z'
        JA  INPUT
        CMP AL,'A'                        
        JAE ABC;输入为A--Z,SI也加1
        CMP AL,'9'
        JA  INPUT
        CMP AL,'0'
        JAE NUM;输入为0--9,DI加1
        JMP INPUT          
ABC:    INC N1
        JMP INPUT            
NUM:    INC N2
        JMP INPUT                 
INEND:  MOV BX,0
        MOV CX,10        
        MOV AX,N1;将字母个数给AX(十六进制转十进制)          
LP0:    MOV DX,0
        DIV CX;AX表示的32位数除以10,商放在AX,余数放在DX
        PUSH DX;将余数压入栈
        INC BX
        CMP AX,0;商不为0就继续除10
        JNZ LP0
        LEA DX,TIP2
        MOV AH,9
        INT 21H;OUTPUT STRING
LP1:    POP DX;DX中数据依次出栈并显示
        ADD DX,30H
        MOV AH,2
        INT 21H;输出字母个数
        DEC BX
        JNZ LP1
        MOV BX,0 
        MOV AX,N2;将数字个数给AX(十六进制转十进制)        
LP2:    MOV DX,0                 
        DIV CX;AX表示的32位数除以10,商放在AX,余数放在DX
        PUSH DX;将余数压入栈
        INC BX
        CMP AX,0
        JNZ LP2;商不为0就继续除10
        LEA DX,TIP3
        MOV AH,9
        INT 21H;输出字符串        
LP3:    POP DX;DX中数据依次出栈并显示
        ADD DX,30H
        MOV AH,2
        INT 21H;输出数字个数
        DEC BX
        JNZ LP3  
        JMP EXIT
EXIT:   LEA DX,TIP5
        MOV AH,9                    
        INT 21H
        MOV AH,1
        INT 21H
        CMP AL,13
        JZ  AA
        JMP START
AA:     MOV AH,4CH
        INT 21H	        
CODE    ENDS
        END     START

运行结果在这里插入图片描述
注:转载请注明出处

  • 25
    点赞
  • 129
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值