汇编实现两位数(包括负数)以内的输入,排序和输出
先将输入的数存储下来,再进行排序,然后输出
汇编无法实现整个数的输入,只能一个位一个位的输入,即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来运行,如果有死循环尝试改一下输入的数,比如全是正数,全是负数,或者一些正一些负,程序问题欢迎大家指正