📄 paixuxin.asm
字号:
名称:paixu
说明:
程序功能:该程序实现从键盘输入若干个数(以十进制形式读入),把这些数存入数组array中,然后将数组中的数按从大到小的顺序排序,最后将数组中的数输出(以十进制形式输出)。
入口参数:
出口参数:
寄存器使用情况:在输入部分:
BX 存放从键盘输入的数
CX 存放10d用做乘数
SI 用于存数组的元素
在排序部分:
AX 存放数组中的数
CX 存放数组中元素个数
SI 用于取数组中的元素
DI 外循环次数的一个备份
在输出部分:
AX 存放除法所得存放在DX中的余数
BX 用于取数组中的元素
CX 存放输出的位数
DX 存放数组中的元素
SI 用于取除数
DI 用于取存商
设计思路:概言之:首先要实现以十进制形式从键盘读入数,接着要实现数组元素的排序,最后要实现以十进制的形式输出。
具体而言:首先要考虑要输入的数是不是负数,若不是负数,则按照以十进制形式输入一个数的规则将从键盘取得的一个十进制数转换为二进制数存入BX寄存器中,若是负数,则将输入的数求补,然后按非负数的规则处理,然后将数组中的元素按冒泡排序方法从大到小排序,最后将排好序的数组,输出要考虑的是:若要输出的数不是负数,则按以十进制的形式输出一个数的规则将DX寄存器中的二进制数转换为十进制数输出,若是负数,则要先输出符号‘-’,然后按照非负数的规则处理。
流程图:
data segment ;定义数据段开始
array dw 50 dup(?) ;定义输入数组
count dw ? ;输入数的个数
flag db ? ;定义数是否为负的标志符号
mess1 db 'Please input a Array?: $'
mess2 db 'Array(from large to small):$' ;定义2个提示字符串
f dw 10000,1000,100,10,1
s db 5 dup(30h),24h
data ends ;数据段定义结束
stack segment para stack 'stack' ; 定义堆栈段开始
dw 100 dup(100) ;堆栈大小为100个字
stack ends
code segment ;定义代码段开始
assume cs:code,ds:data,ss:stack ;
main proc far ;定义过程开始
start: push ds ;START为程序执行时的启始标号
xor ax,ax
push ax ;设置返回地址
mov ax,data
mov ds,ax ;数据段段始址送DS
lea dx,mess1 ;提示字符串1始址送DX
mov ah,09h ;功能号9送AH
int 21h ;9号功能调用,输出提示字符1
mov si,0
mov count,0
input: mov bx,0
mov flag,0
newchar2:mov ah,1 ;键盘输入
int 21h
mov dl,al
cmp dl,'-' ;和负号比较
je l0 ;相等转l0
cmp dl,','
je store ;若输入是逗号则将刚输入的那个数存到数组中
cmp dl,13 ;输入数组以回车键结束
je exit2
sub al,30h
cbw ;字节扩展到字
xchg ax,bx
mov cx,10d ;将输入的数转化成十进制的数
mul cx
xchg ax,bx
add bx,ax
jmp newchar2
l0: mov flag,1
jmp newchar2
store: cmp flag,1 ;将标志符与1比较
jne next ;若不是负数则转向next
neg bx ;对负数求补
next: mov array[si],bx ;将键盘输入的数存到数组array中
inc count ;数组元素个数加1
add si,2
jmp input
exit2: mov dl,0ah ;输出回车换行
mov ah,02h
int 21h
mov dl,0dh
mov ah,02h
int 21h
mov cx,count ;取数据个数到cx中
dec cx
loop1: mov di,cx ;外循环次数的一个备份
mov si,0
loop2: mov ax,array[si] ;取数组中的数
cmp ax,array[si+2] ;array[i]与array[i+1]比较
jge continue ;大于等于转
xchg ax,array[si+2] ;array[i]与array[i+1]互换
mov array[si],ax ;保存较大的数到array[i]
continue:add si,2
loop loop2
mov cx,di
loop loop1
lea dx,mess2 ;提示字符串1始址送DX
mov ah,09h ;功能号9送AH
int 21h ;9号功能调用,输出提示字符1
mov dx,0
mov bx,0
outp: mov di,0 ;用于存商
mov si,0 ;用于取除数
mov cx,5 ;因有5位(万,千,百,十,个)
mov dx,array[bx] ;一开始就把被除数看成余数
add dx,0 ;形成标志位
jns l1 ;若不是负数转l1
neg dx ;对负数求补
push dx
mov dl,'-' ;输出负号
mov ah,02h
int 21h
pop dx
l1: mov s[di],30h
mov ax,dx ;余数存入AX
mov dx,0
div f[si] ;除以权
add s[di],al
inc di
add si,2
loop l1 ;循环
mov di,0
l2: cmp s[di],30h ;实现前面的0不输出
jne l3
inc di
jmp l2
l3: lea dx,s[di] ;要输出的数的始址送DX
mov ah,09h ;功能号9送AH
int 21h ;9号功能调用,输出提示字符1
add bx,2
mov dl,',' ;输出的数之间以逗号隔开
mov ah,02h
int 21h
dec count ;数组元素个数减1
jnz outp
ret
main endp ;过程定义结束
code ends ;代码段定义结束
end start ;整个程序到此为止,运行时从START处开始
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -