2021-10-13

汇编语言输入十个数(0-2559)排序好后输出

一.实验目的:输入十位数排序好后输出
二.实验代码:
DATAS SEGMENT
buf dw 20 dup(0)
line db 10, 13, ?
DATAS ENDS

STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX

mov si, offset buf
mov bp, 0
mov ch,10

do: call input;输入函数
mov [si+bp],bx
add bp,2
sub ch,1
cmp ch,0
ja do

call paixu;排序函数    

call hchh;回车换行函数

mov ch,10
mov bp,0

eo: mov ax,[si+bp];将输入函数出口参数转到输出函数入口参数
call output;输出函数
call hchh;
add bp,2
sub ch,1
cmp ch,0
ja eo

MOV AH,4CH
INT 21H

input proc;无入口参数,输出参数bx
push dx
push ax
push cx
mov dh,10
mov bx,0;bx初始值0
be: mov ah,1
int 21h;输入
cmp al,‘0’
jb next
cmp al,‘9’
ja next;严格限制输入为0-9
sub al,48
mov cl,al;保护输入的新数
mov ch,0;

mov ax,bx
mul dh
add ax,cx;bx=原来的bx值乘10+新数
mov bx,ax;因为输出参数bx,所以最后转到bx
jmp be;无条件跳到be

next:
pop cx
pop ax
pop dx
ret
input endp

output proc;输入参数ax,无输出参数
push ax
push bx
push cx
push dx
mov bl,10
mov cl,0

co: div bl
push ax;压栈,主要为了保护ah
add cl,1;cl相当于计数器,记录位数
mov ah,0;ah置零,即al值为现在ah的值
cmp al,0;商为0作为结束标志
ja co

ao: pop bx
mov dl,bh;bh即原来的ah
add dl,48
mov ah,2
int 21h
sub cl,1
cmp cl,0
ja ao;最高位一直输出到最后一位
pop dx
pop cx
pop bx
pop ax
ret
output endp

hchh proc;回车换行函数
mov dl,13
mov ah,2
int 21h

mov dl,10
mov ah,2
int 21h
ret

hchh endp

paixu proc
mov si, offset buf
push ax
push bx
push cx
push dx

mov dx,0
mov ax,0
mov bx,0
mov ch,0;ch控制第一层循环,循环次数
mov bp,2;bp为buff初始偏移量

ko: mov bx,bp
sub bx,2;bx比bp小2,即bx是bp的前一个数
mov ax,[si+bx]
mov dx,[si+bp]
cmp dx,ax
ja go;如果后一个数比前一个数大
jmp ho

go: mov [si+bp],ax
mov [si+bx],dx;就交换

ho: cmp bp,20
jae lo
add bp,2;bp即偏移量加2
jmp ko

lo: add ch,1
mov bp,2 ;bp每次都从初始值2,开始
cmp ch,10
jbe ko

pop dx
pop cx
pop bx
pop ax

ret

paixu endp

CODES ENDS
END START

三.实验思路:
1.分别写了四个子函数,输入函数,输出函数,回车换行,排序函数
2.利用循环控制十个输入,十个输出
3.排序改自c语言(可对该部分进行进一步改进)
for(i=0<;i for(j=1;j if(a[j]>a[j-1])
交换
四.实验中需要注意的问题
1.buf dw 20 dup(0) ,buf最好用dw。
2.bp偏移量每次改变2,而不是1。
3.ch,ah等高八位在某些操作后记得要更改为0,否则影响下面某些步骤。
4.写二重循环时认真看几遍,防止出错。
五.指导老师
孟庆武老师(老师超级好,超级有耐心)

你可能感兴趣的:(汇编语言,开发语言)