汇编实现两位数(包括负数)以内的输入,排序和输出

汇编实现两位数(包括负数)以内的输入,排序和输出

先将输入的数存储下来,再进行排序,然后输出

汇编无法实现整个数的输入,只能一个位一个位的输入,即123拆开成1,2,3来一个个读入

基本原理:将负数,整数分开存储到数据段,且都一位一位的存储

以下代码单独实现数据的输入

;2.  用户输入不少于5个,
;不多于30个的十进制整数
;(含负数,绝对值小于100),
;排序后将结果输出。
assume cs:code,ds:data,ss:stack
 
data segment
    tip db 'please input your number',13,10,'$'
    fushu db 15 dup (0)
    zhengshu db 15 dup (0)
data ends
 
stack segment
    db 10000 dup (0)
stack ends
 
code segment
 
fushu_input:    push cx
                lea bx,fushu
                mov cx,10
        s2:     mov ah,1;存储新输入的数
                int 21h
                mov ah,0                
                push ax
                cmp al,' ';空格表示一个数据输入完成
                jz over1
 
                mov al,10
                mul byte ptr ds:[bx+si]
                mov ds:[bx+si],al
                pop ax
                add ds:[bx],al;给上一次输入的十进制数乘10,并加上新输入的数
 
                loop s2
 
        over1:  inc si
                pop cx
                ret
 
zhengshu_input: push cx               
                mov ds:[bx+di],al;把第一位数先存进去
                lea bx,zhengshu
                mov cx,10
        s3:     mov ah,1;此时为整数的第二位数的存储
                int 21h
                mov ah,0
                push ax
                cmp al,' ';空格表示一个数据输入完成
                jz over2
 
                mov al,10
                mul byte ptr ds:[bx+di]
                mov ds:[bx+di],al
                pop ax
                add ds:[bx+di],al;乘10移位,并加上新输入的数
 
                loop s3
 
        over2:  inc di                
                pop cx
                ret
 
 
        start:      
                mov ax,data
                mov ds,ax
                mov ax,stack
                mov ss,ax
                mov sp,10000
                mov si,0;负数的偏移量用si
                mov di,0;正数的偏移量用di
                ;缺省
 
                lea dx,tip
                mov ah,9
                int 21h;输出提示符
 
                ;单个数的输入,一个一个字符读取
                mov cx,30
        s1:     mov ah,1
                int 21h
                cmp al,'-';若为负数则跳转
                jz fushu_input
                cmp al,'-'
                jnz zhengshu_input;反之则为正数跳转
                cmp al,13
                jz output
                loop s1
 
                mov ax,4c00h
                int 21h
code ends
end start

以下为完整代码

;2.  用户输入不少于5个,
;不多于30个的十进制整数
;(含负数,绝对值小于100),
;排序后将结果输出。
assume cs:code,ds:data,ss:stack

data segment
    tip db 'please input your number',13,10,'$'
    fushu db 50 dup (0)
    len1 db ?
    zhengshu db 50 dup (0)
    len2 db ?
data ends

stack segment
    db 100 dup (0)
stack ends

code segment

fushu_input:    push cx
                lea bx,fushu
                mov cx,10
fushu_input_s:  mov ah,1;存储新输入的数
                int 21h
                mov ah,0                
                push ax
                cmp al,' ';空格表示一个数据输入完成
                jz over1
                
                mov al,10
                mul byte ptr ds:[bx+si]
                mov ds:[bx+si],al
                pop ax
                sub al,'0'
                add ds:[bx+si],al;给上一次输入的十进制数乘10,并加上新输入的数

                loop fushu_input_s

        over1:  inc si
                pop ax 
                pop cx
                jmp s1

zhengshu_input: push cx
                lea bx,zhengshu
                sub al,'0'               
                mov ds:[bx+di],al;把第一位数先存进去
                mov cx,10
zhengshu_input_s:mov ah,1;此时为整数的第二位数的存储
                int 21h
                mov ah,0
                push ax
                cmp al,' ';空格表示一个数据输入完成
                jz over2
                
                mov al,10
                mul byte ptr ds:[bx+di]
                mov ds:[bx+di],al
                pop ax
                sub al,'0'
                add ds:[bx+di],al;乘10移位,并加上新输入的数

                loop zhengshu_input_s

        over2:  inc di   
                pop ax             
                pop cx
                jmp s1


        start:      
                mov ax,data
                mov ds,ax
                mov ax,stack
                mov ss,ax
                mov sp,100
                mov si,0;负数的偏移量用si
                mov di,0;正数的偏移量用di
                ;缺省

                lea dx,tip
                mov ah,9
                int 21h;输出提示符

                ;单个数的输入,一个一个字符读取
                mov cx,30
        s1:     mov ah,1
                int 21h
                cmp al,13
                jz sort;回车即结束,开始排序
                cmp al,'-';若为负数则跳转
                jz fushu_input
                cmp al,'-'
                jnz zhengshu_input;反之则为正数跳转
                
                loop s1

        sort:
                ;正数排序

                ;存储正数,负数的个数
                lea bx,zhengshu
                mov ax,di
                mov ds:[bx+50],al

                lea bx,fushu
                mov ax,si
                mov ds:[bx+50],al


                lea bx,zhengshu
                ;嵌套循环,共计两层
                mov cl,ds:[bx+50]
                mov ch,0;数据的个数即循环次数
                

        ;第一层循环
zhengshu_sort_s1:push cx
                mov cl,ds:[bx+50]
                mov ch,0
                sub cx,1;n-1次swap
                mov di,0
            ;第二层循环
    zhengshu_sort_s2:mov ah,ds:[bx+di]
                    mov al,ds:[bx+di+1]
                    cmp ah,al
                    jb no_swap_1

                    ;swap
                    mov ds:[bx+di+1],ah
                    mov ds:[bx+di],al

    no_swap_1:      inc di
                    loop zhengshu_sort_s2
               
                    pop cx
                    loop zhengshu_sort_s1




                ;负数排序
                lea bx,fushu
                ;嵌套循环,共计两层
                mov cl,ds:[bx+50]
                mov ch,0;数据的个数即循环次数


        ;第一层循环
fushu_sort_s1:  push cx
                mov cl,ds:[bx+50]
                mov ch,0
                sub cx,1;n-1次swap
                mov si,0
            ;第二层循环
    fushu_sort_s2:  mov ah,ds:[bx+si]
                    mov al,ds:[bx+si+1]
                    cmp ah,al
                    ja no_swap_2

                    ;swap
                    mov ds:[bx+si+1],ah
                    mov ds:[bx+si],al

    no_swap_2:      inc si
                    loop fushu_sort_s2
            
                    pop cx
                    loop fushu_sort_s1



        output: 
                ;从小到大输出,先负数,再正数

                ;负数输出
                lea bx,fushu
                mov al,ds:[bx+50]
                mov ah,0
                mov si,ax
                mov cx,si;循环长度
                
                mov si,0
fushu_output_s: mov dl,'-'
                mov ah,2
                int 21h;先输出负号
                
                mov ah,0
                mov al,ds:[bx+si]
                mov dl,10
                div dl
                cmp al,0
                jz single1
                push ax

                mov dl,al
                add dl,'0'
                mov ah,2
                int 21h

                pop ax
        single1:mov dl,ah
                add dl,'0'
                mov ah,2
                int 21h

                mov dl,' '
                mov ah,2
                int 21h

                inc si
                loop fushu_output_s

                ;正数输出
                lea bx,zhengshu
                mov al,ds:[bx+50]
                mov ah,0
                mov di,ax
                mov cx,di;循环长度
                
                mov di,0

zhengshu_output_s:mov ah,0
                mov al,ds:[bx+di]
                mov dl,10
                div dl
                cmp al,0
                jz single2
                push ax

                mov dl,al
                add dl,'0'
                mov ah,2
                int 21h

                pop ax
        single2:mov dl,ah
                add dl,'0'
                mov ah,2
                int 21h

                mov dl,' '
                mov ah,2
                int 21h

                inc di
                loop zhengshu_output_s

                mov ax,4c00h
                int 21h
code ends
end start

注意:本程序中输入数据之间用空格分隔开,输完最后一个数据时,先输入空格再输入回车,才可完成数据的输入

排序算法用的最简单的冒泡排序,还可以拓展替换成归并排序,基数排序,插入排序以及快速排序等等

代码用的sublime写的,用的dosbox来运行,如果有死循环尝试改一下输入的数,比如全是正数,全是负数,或者一些正一些负,程序问题欢迎大家指正

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值