实验内容
编写一个汇编语言程序,实现先输入一个0-100的数N,然后输入N个数,以回车结束每个数字并显示在屏幕上,再将未排序前和从小到大排序后的结果显示在屏幕上。实验结果应达到如下的一个界面:在这里插入图片描述
实验过程
本次汇编语言程序设计要求的是对n个数进行排序,首先我们要定义程序结果的那些字符串以及这个n个数的一个数组。同时我们应该设置一个堆栈段来实现数的显示。
接着我们可是程序的正式开始部分,我们通过9号调用来输出我们所要展示的字符串,然后用换行符来换行,接着我们输入数字n,循环输入数字的每一位并显示出来,然后将数字n保存在cx里面。这其中应该通过1号调用程序来实现数字的回显。
然后我们要从低位到高位,把数字n进行压栈操作,保留这个数字的一个顺序之后再出栈来显示出这个数字n。再通过把数字n放在cx里面,可以作为后面循环输入n个数字的一个loop的次数。
接着我们通过输入n个data并保存在数组array里面。data的输入和输出和前面的n是一样的道理。最后我们通过冒泡排序对这个顺序来重排,而冒泡排序采用的是是书上的例题的程序,使用的是一种双重循环的方法。
最后我们再通过排序后的这样一个数组输出,输出的方法也是和前面的方法是大致相同的。
实验结果演示:
在这里插入图片描述
附上代码:
DATAS SEGMENT
    S1 db 'How many data to input?(less than equal to 100)','$'
    S2 db 'Input ','$'
    S3 db ' data,press[Enter] after input each data.','$'
    S4 db 'Before sorting:','$'
    S5 db 'After sorted:','$'
    array dw 100 dup(?) 
DATAS ENDS
STACKS SEGMENT  
    stack db 100h dup(?)
STACKS ENDS
CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    XOR CX,CX
    MOV DX,OFFSET S1
    MOV AH,09H
    INT 21H;9号调用 输出字符串S1
    
    MOV DL,0AH;换行符
    MOV AH,02H;2号调用 DL等于输出字符
    INT 21H
    MOV DL,10
    
L1:;(循环)输入数字n并显示 数字n保存在CX(可以loop)
    MOV AH,1;1号调用 键盘输入回显 AL=输入字符
    INT 21H
    CMP AL,0DH;与回车比较(0AH是换行)
    je L2;回车则跳L2
    SUB AL,30H
    AND AX,00FFH;AH清0 AL不变
    MOV BX,AX
    MOV AX,CX
    MUL DL;8位乘法 AX<- AL*DL 十位数乘10 
    ADD AX,BX;十位加个位
    MOV CX,AX;先把n保存到CX AX用来调用
    CMP BL,0DH
    JNZ L1 
    
L2:
    MOV DL,0AH
    MOV AH,02H;2号调用 DL等于输出字符
    INT 21H
    MOV DX,OFFSET S2;
    MOV AH,09H
    INT 21H;9号调用 输出字符串S2
    MOV AX,CX
    
    MOV BH,10
    MOV BL,0
    XOR DX,DX   
L3:;从低位到高位 把n压栈
    DIV BH;AL<-AX/BH AH<-AX%BH
    MOV DL,AH
    ADD DX,30H
    PUSH DX
    INC BL;BL计数n的位数
    AND AX,00FFH
    CMP AL,0
    JNZ L3
    
L4:;输出n
    POP DX
    MOV AH,02H;二号调用显示n
    INT 21H
    DEC BL
    CMP BL,0
    JNZ L4
    
    MOV DX,OFFSET S3
    MOV AH,09H
    INT 21H
    MOV DL,0AH
    MOV AH,02H
    INT 21H
    
    MOV SI,0
    MOV DI,10
    XOR DX,DX
    
L6:;(循环)输入一个data
    MOV AH,01H
    INT 21H
    CMP AL,0DH
    JE L7
    SUB AL,30H
    AND AX,00FFH
    MOV BX,AX
    MOV AX,DX
    MUL DI
    ADD AX,BX
    MOV DX,AX
    CMP BL,0DH
    JNE L6
    
L7:;输入n个data保存在数组内
    MOV array[SI],DX
    ADD SI,2
    MOV DL,0AH
    MOV AH,02H
    INT 21H
    XOR DX,DX
    LOOP L6
    
    MOV DX,OFFSET S4
    MOV AH,09H;输出S4
    INT 21H
    SHR SI,1;SI/2
    MOV CX,SI
    MOV SI,0
    
L8:
    MOV AX,array[SI]
    MOV BH,10 
    MOV BL,0
    XOR DX,DX
    
L9:;把1个data(循环)压栈,BL计数位数
    DIV BH;AL<-AX/BH AH<-AX%BH
    mov DL,AH
    ADD DX,30H
    PUSH DX
    INC BL
    AND AX,00FFH
    CMP AL,0
    JNZ L9
    
L10:;把一个data(循环)出栈
    POP DX
    MOV AH,02H
    INT 21H
    DEC BL
    CMP BL,0
    JNZ L10
    
    MOV DL,32
    MOV AH,02H
    INT 21H
    ADD SI,2
    LOOP L8
    
    MOV DL,0AH
    MOV AH,02H
    INT 21H
    
sort:;冒泡排序
    SHR SI,1
    MOV DX,SI
    MOV CX,SI
    DEC CX
loop1:
    mov di,cx
    mov bx,0
loop2:
    mov ax,array[bx]
    cmp ax,array[bx+2]
    jle continue
    xchg ax,array[bx+2]
    mov array[bx],ax
continue:
    add bx,2
    loop loop2
    mov cx,di
    loop loop1
    
    MOV CX,DX
    MOV SI,0
    MOV DX,OFFSET S5
    MOV AH,09H
    INT 21H
    
L11:;排序后输出
    MOV AX,array[SI]
    MOV BH,10
    MOV BL,0
    XOR DX,DX
L12:
    DIV BH
    MOV DL,AH
    ADD DX,30H
    PUSH DX
    INC BL
    AND AX,00FFH
    CMP AL,0
    JNZ L12
L13:
    POP DX
    MOV AH,2
    INT 21H
    DEC BL
    CMP BL,0
    JNZ L13
    MOV DL,32
    MOV AH,02H
    INT 21H
    ADD SI,2
    LOOP L11
        
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START