【汇编语言】从键盘输入10个带符号字节数据,将其从小到大排序,并将结果在显示器上以十进制形式显示输出。

通过调用子程序,实现从键盘输入10个带符号字节数据,将其从小到大排序,并将结果在显示器上以十进制形式显示输出。

data segment
   ary db 10 dup(0)   ;用于存放输入数据
   count db 10
   x db '-'      ;x存放'-',后面用于判断
   sfn db 0      ;标识,用于判断是否输入负数
   mess1 db 'Input :','$'
   mess2 db 0ah,0dh,'Output :$';0ah和0dh是换行和回车
data ends

stack segment
   db 100 dup(?)
stack ends

code segment
assume ds:data,cs:code,ss:stack
start:
   mov ax,data
   mov ds,ax
   
   call cin
   call sort
   call cout

   mov ah,4ch
   int 21h
   
cin proc near    ;输入 
   push ax
   push bx
   push cx
   push dx
   push si
   lea si,ary
   mov cl,count
   
 cinlop:
   lea dx,mess1
   mov ah,9;显示信息:"Input :"
   int 21h
   
 input:
     mov ah,1   ;输入
     int 21h
     mov bl,al
     cmp bl,x   ;判断是否为负数
     je equal   ;将sfn赋值为1
     cmp bl,0dh ;判断输入是否结束
     jz retu   ;退出输入
     mov bh,0
     sub al,30h
     mov bh,al
     xor bl,bl
     mov bl,0ah
     sub al,al
     mov al,[si]  ;对原来的数乘10
     mul bl
     mov ah,[si]
     sub [si],ah  ;将原来的数清除,否则会出现累加错误
     add [si],al  ;存入[si]add [si],bh
     jmp input
     
 retu:           
     cmp sfn,1   ;如果sfn为1,则将[si]中的数取为相反数
     jz reset
 retub:   
     mov sfn,0   ;将sfn重置为0,实现下一次的赋值判断
     inc si      ;数组指针下移
     loop cinlop
     jmp exit 
     
 reset:
     mov al,[si]
     neg al
     mov [si],al
     jmp retub
         
 equal:
     mov sfn,1
     jmp input   ;返回input主程序,并重新输入  
     
 exit:   
     pop si
     pop dx
     pop cx
     pop bx
     pop ax
     ret        
cin endp        
     
cout proc near
    push ax
    push bx
    push cx
    push dx
    push si
    
    lea si,ary
    xor cx,cx
    mov bh,count
    mov cl,bh
 coutp:
    mov bh,cl
    lea dx,mess2
    mov ah,9     ;显示信息:"Output :"
    int 21h
    mov al,[si]
    cmp al,0
    jl exch      ;判断要输出的数据是否为负
 judge:
    mov dl,al
    sub cx,cx
    mov cx,1     ;计数,初始为1
    mov bl,10    ;每次除10 
 print:
    mov ah,0     ;清零
    mov al,dl
    div bl       ;10
    push ax      ;入栈
    cmp al,0
    jle endl
    mov dl,al
    inc cx
    jmp print
    
 endl:
    pop dx
    xchg dh,dl   ;余数转入dl
    add dl,30h
    mov ah,2
    int 21h
    loop endl
    inc si
    mov cl,bh
    loop coutp
    jmp exit1
 exch:
    mov dl,x
    mov ah,2
    int 21h
    mov al,[si]   ;[si]中的值重新赋值给al,否则会出错
    neg al
    jmp judge
 exit1: 
   
    pop si
    pop dx
    pop cx
    pop bx
    pop ax
    ret
cout endp 
 
sort proc near     ;该子程序实现数组排序
     push ax
     push bx
     push cx
     push dx
     push si
     push di
    
     mov cl,count
     dec cl        ;外层循环次数为总数组数-1
     ;lea bx,ary   ;也可以尝试使用bx作为变址
     mov si,0
     mov di,0
lp1: 
     push cx
     mov cl,count
     dec cl
     xor ch,ch
     sub cx,si
     mov di,0
lp2:  
     mov al,ary[di]
     mov ah,ary[di+1]
     ;mov al,[bx+di]
     ;mov ah,[bx+di+1]
     cmp al,ah
     jle exit2
     ;mov al,[bx+di+1]
     ;mov ah,[bx+di]
     xchg ah,al     ;该语句可以实现上面两条语句功能
     mov ary[di+1],ah
     mov ary[di],al
     ;mov [di+1],ah
     ;mov [di],ah                 
exit2:
     inc di
     loop lp2
     pop cx
     inc si         ;随着外层循环增加,内存循环次数减少
     loop lp1
     
     pop di
     pop si
     pop dx
     pop cx
     pop bx
     pop ax
     ret
sort endp
            
code ends
   end start

实验测试:
在这里插入图片描述
参考文章:1、实现单个数据的键盘输入输出
2、汇编排序算法小结

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值