汇编入门程序,冒泡排序

写了半天发现资料不多,放上来造福一下人类,主要题库的题也好多题解太少

用汇编语言编写程序,要求实现以下功能:

程序执行后,屏幕显示提示信息:“Please Enter The Password:”,等待输入用户的5位密码(含字母和数字)。密码输入后,与程序内设定的密码相比较,如果比较结果正确,显示“Welcome To Scce!”,如果不正确,则显示你的学号和姓名拼音。

请在答题时,按照以下格式填写内容:

1、程序源代码(包含必要的注释信息)

2、程序运行截图

DATA    SEGMENT
INPUT   DB  "Please Enter The Password:",'$'        
PASS    DB  "12345",'$'
OUTPUT  DB  "Welcome To Scce!",'$'  
ERR     DB  "PASSWORD ERROR!",'$'
BUFFER  DB  20          ;预定义20字节的空间
        DB  0          ;待输入完成后,自动获取输入的字符个数
        DB  20  DUP(0)
CRLF    DB  0AH,0DH,'$'
DATA    ENDS

STACK   SEGMENT STACK
        DW  20  DUP(0)  ;在此输入堆栈段代码
STACK   ENDS

CODE    SEGMENT
ASSUME  CS:CODE,DS:DATA,SS:STACK
START:
    MOV AX,DATA
    MOV DS,AX   
    
    LEA DX,INPUT        ;打印提示输入信息INPUT
    MOV AH,09H
    INT 21H     
    
    LEA DX,BUFFER       ;接收字符串BUFFER
    MOV AH,0AH
    INT 21H       
       
    MOV AL,BUFFER+1     ;对字符串进行处理
    ADD AL,2
    MOV AH,0
    MOV SI,AX
    MOV BUFFER[SI],'$'
    
    LEA SI,BUFFER+2
    PUSH    DS
    POP ES
    LEA DI,PASS
    MOV CX,0
    MOV CL,BUFFER+1
    CLD
    REPE    CMPSB
 
    JNZ NOTMATCH       ;不相等跳出,ZF=0   
    
    LEA DX,CRLF         ;另取一行             
    MOV AH,09H
    INT 21H  
    
    LEA DX,OUTPUT       ;打印提示输出信息OUTPUT
    MOV AH,09H
    INT 21H
       
    JMP NEXT
    
NOTMATCH:
    LEA DX,CRLF         ;另取一行
    MOV AH,09H
    INT 21H
    
    LEA DX,ERR        ;打印提示输出信息PASSERROR
    MOV AH,09H
    INT 21H
    
    
NEXT:    
    MOV AH,4CH          ;返回DOS系统
    INT 21H
CODE    ENDS
END START

在这里插入图片描述
在这里插入图片描述

用汇编语言编写程序,实现冒泡排序功能。要求,从屏幕输入15个100以内的数,用冒泡法对其从小到大排序,在屏幕上显示每一步排序的过程。排序功能用子程序实现。

请在答题时,按照以下格式填写内容:

1、程序源代码(包含必要的注释信息)

2、程序运行截图
贴一个链接,他的冒泡感觉有点怪我换成书上的了
冒泡参考代码

DATAS SEGMENT
SINPUT DB 'welecome and please input the 15 N:$'
SINPUTNUM DB 'please input the number with index number $'
SSHOWNUMDATA DB 'The contents of the array are: $'
SSHOWSORTNUM DB 'The contents of the sorted array are: $'
SSHOWINSORTNUM DB 'The contents IN the sorted array are: $'
BUF1 DB 20H
     DB  0
     DB 20H DUP(0)
NUM  DW  ?
N     DW  ?
NUMDATA DW 0FFH DUP(-1);最大容量256       

DATAS ENDS

   
STACKS SEGMENT PARA STACK
    DW 30H DUP(0)
STACKS ENDS


CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    
    MOV AH,09H      ;显示字符串
    LEA DX,SINPUT   ;取段内偏移地址
    INT 21H         ;调用系统dos中断
    
    MOV DL,0DH      ;回车换行
     MOV AH,2        
     INT 21H         
     MOV DL,0AH      
     MOV AH,2        
     INT 21H    
    
    MOV NUM,4H     ;赋值15                    
    MOV AX,NUM;     ;借用AX将键盘输入的NUM转给N
    MOV N,AX;
                
                
    ;一个循环,实现数组读取
    
    MOV CX,N        ;设置循环次数
L1:
                    ;这一段显示提示文字
    MOV AH,09H      ;显示字符串
    LEA DX,SINPUTNUM
    INT 21H           
    
    MOV BX,N        ;总循环次数
    SUB BX,CX       ;相减
    INC BX          ;加一
                    ;此时BX为当前循环次数
    MOV NUM,BX      ;当前数字存进去   
    
    CALL SHOWNUM    ;调用显示数字子程序
    
    MOV DL,' '      ;传送字符
     MOV AH,2        ;显示一个字符
     INT 21H          
     
    MOV DL,':'      ;传送字符
     MOV AH,2        ;显示一个字符
     INT 21H         
    
    MOV AH,0AH      ;键盘输入到缓冲区
    LEA DX,BUF1     
    INT 21H         
    
    CALL STOI       ;调用输入处理子程序

    
    ;借用AX将键盘输入的NUM转给NUMDATA
    MOV BX,N            ;总循环次数
    SUB BX,CX           ;相减
                        ;此时BX为当前循环次数
    MOV AX,NUM          ;当前数字存进去
    MOV NUMDATA[BX],AX  ;放进数组中  
        
LOOP L1                 ;循环
   
   
    MOV AH,09H          ;显示原始字符串
    LEA DX,SSHOWNUMDATA
    INT 21H             
    
    CALL SHOWNUMDATA    ;调用子程序显示数组内容
       
       
    CALL SORTNUM        ;调用冒泡排序算法
    
    
    MOV AH,09H          ;显示字符串,排序后的数组为:
    LEA DX,SSHOWSORTNUM
    INT 21H             
    
    CALL SHOWNUMDATA    ;调用子程序显示数组内容
    
    ;程序终止代码
    MOV AX,0
    MOV AH,4CH
    INT 21H


;这是一段子程序,用来进行冒泡排序
SORTNUM PROC
    MOV CX,N        ;设置大循环次数
    DEC CX          ;总次数减一为外循环次数
OUTLP:
    MOV DX,CX           ;DX内循环个数
    MOV BX,OFFSET NUMDATA
INLP:
    MOV AL,[BX]         ;取前一个元素
    CMP AL,[BX+1]       ;与后一个元素比较
    JNA NEXT            ;前一个元素不大于后一个元素,则不进行交换
    XCHG    AL,[BX+1]   ;否则,进行交换
    MOV [BX],AL
NEXT:
    INC BX              ;下一对元素
    DEC DX
    JNZ INLP            ;内层循环
    
    PUSH    AX
    PUSH    BX
    PUSH    CX
    PUSH    DX
    MOV AH,09H          ;显示字符串,排序中的数组为:
    LEA DX,SSHOWINSORTNUM
    INT 21H                 
    CALL SHOWNUMDATA    ;调用子程序显示数组内容    
    POP DX
    POP CX
    POP BX
    POP AX
    
    LOOP    OUTLP       ;外循环尾   
        
    RET
SORTNUM ENDP    


;这是一段子程序,用来输入数字
STOI PROC
                    ;初始化
    MOV DX,0
    MOV BX,10
    MOV SI,2
    MOV NUM,0
    MOV AX,0
LOP:
    MOV AL,BUF1[SI] ;寄存器相对寻址,从缓冲区取一个字符
    CMP AL,0DH      ;是否是CR
    JE  FINAL       ;等于就跳转,JNE相反
    SUB AL,30H      ;减48,从ASCII码转数字
    CMP NUM,0       ;与0比较,相当于判断初始化
    JE  DO_DEAL     ;等于就跳转,JNE相反
    PUSH AX         ;当前数字压入栈中
    MOV AX,NUM      ;当前数送入运算寄存器中
    MUL BX          ;隐含寻址,在AX中,相当于NUM乘以10
    MOV  NUM,AX     ;运算结果存进NUM中  
    POP AX          ;之前的数据弹出
DO_DEAL:
    ADD NUM,AX      ;加上之前的数据
    MOV AX,0        ;清零
    INC SI          ;自加1
    JMP LOP         ;跳转,处理下一个
FINAL:
                    
    MOV DL,0DH      ;回车换行
     MOV AH,2        
     INT 21H         
     MOV DL,0AH      
     MOV AH,2        
     INT 21H         
RET                 
STOI ENDP


;这是一段子程序,用来显示数字NUM
SHOWNUM PROC
                    ;第一位
    MOV BL,100      ;%先除100
    MOV AX,NUM      ;送入运算寄存器
    DIV BL          ;除法,AX隐含寻址
    ADD AL,30H      ;商转换为ASCII码
    PUSH AX         ;将余数先压入栈中
    CMP AL,30H      ;看一看首位是不是0
    JE BITTWO       ;若是,则不显示直接跳转到下一个
    MOV DL,AL       ;传送字符
     MOV AH,2        ;显示一个字符
     INT 21H         
BITTWO:    
    POP AX          ;将余数取出
    
                    ;第二位
    MOV AL,AH       ;送入运算寄存器
    MOV AH,0        ;高位清零
    MOV BL,10       ;%再除以10
    DIV BL          ;除法,AX隐含寻址
    ADD AL,30H      ;商转换为ASCII码
    PUSH AX         ;将余数先压入栈中
    CMP NUM,10      ;看一看数是不是小于10
    JB BITTTHREE    ;若是,则不显示第二位直接跳转到末位
    MOV DL,AL       ;传送字符
     MOV AH,2        ;显示一个字符
     INT 21H         ;调用系统dos中断
BITTTHREE:
     POP AX          ;将余数取出
     
                     ;第三位
     ADD AH,30H      ;余数转换为ASCII码
     MOV DL,AH       ;传送字符
     MOV AH,2        ;显示一个字符
     INT 21H         ;调用系统dos中断
     
RET                 ;子程序退出重置堆栈
SHOWNUM ENDP


;这是一段子程序,用来显示数组NUMDATA
SHOWNUMDATA PROC
    MOV CX,N        ;设置循环次数为数组大小
    MOV BX,0        ;循环计数
L4:
    PUSH BX             ;将循环计数存入堆栈
    MOV AX,NUMDATA[BX]  ;从数组中读取当前数字,一次取一个字,两个字节
    MOV AH,0            ;高位清零
    MOV NUM,AX          ;将AX低位数据传送到NUM
    CALL SHOWNUM        ;调用子程序显示数字
    MOV DL,','          ;传送字符
     MOV AH,2            ;显示一个字符
     INT 21H             
     POP BX              ;将循环计数从堆栈中取出
     INC BX              ;计数自加1
LOOP L4                 
                        ;换行
    MOV DL,0DH          ;CR
     MOV AH,2            ;显示一个字符
     INT 21H             
     MOV DL,0AH          ;LF
     MOV AH,2            ;显示一个字符
     INT 21H             
RET                     ;子程序退出重置堆栈
SHOWNUMDATA ENDP


CODES ENDS
    END START

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值