输入十个数据 进行冒泡排序
找个自己顺眼的C语言 冒泡排序 转换为汇编
下面是十个数的排序 其他个数的排序原理一样
;冒泡排序
DATAS SEGMENT
arr Dw 12 dup(?)
block db 32,'$'
STR1 DB 'Please input 10 numbers:',13,10,'$'
STR2 DB 13,10,'The sort result:',13,10,'$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;输入
lea dx,STR1
MOV AH,09H
INT 21H
mov di,0
L3: add di,2
call input
mov arr[di],ax
cmp di,20
jne L3 ;存入内存区
mov si,offset arr;入口参数
call SORT
;输出
lea dx,STR2
MOV AH,09H
INT 21H
mov di,0
L4:
add di,2
mov ax,arr[di]
call output
cmp di,20
jne L4
MOV AH,4CH
INT 21H
INPUT PROC
push BX
PUSH CX
PUSH DX
MOV DH,10 ;存乘数
L1:
MOV AH,1
INT 21H ;输入
CMP AL,'0'
JB L0
CMP AL,'9'
JA L0 ;不在0-9之内的直接跳到输出
SUB AL,48
MOV CL,AL;CL<-当前输入的数 CX=CL
;MOV CH,0 可有可无
MOV AX,BX ;MUL 默认是乘AX ,BX<-存着之前的数
MUL DH
ADD AX,CX ;新数+原来的数*10
MOV BX,AX ;把加完后的数存到BX里
JMP L1
L0:
MOV AX,BX
POP DX
POP CX
POP BX
RET
INPUT ENDP ;出口参数是aX aX存着输入的数
OUTPUT PROC
PUSH BX
PUSH CX
PUSH DX
MOV BH,1
MOV CL,10
AGAIN:
DIV CL
PUSH AX
CMP AL,0
JE PRINT
INC BH
MOV AH,0
JMP AGAIN
PRINT:
CMP BH,0
JE OVER
POP DX
MOV DL,DH
ADD DL,48
MOV AH,2
INT 21H
DEC BH
JMP PRINT
OVER:
lea dx,block
MOV AH,09H
INT 21H
POP DX
POP CX
POP BX
RET
OUTPUT ENDP
;排序子函数
SORT PROC
push si;arr首地址
push di
push bx
push cx
push dx
mov bx,0 ;外层循环计数
mov cx,20;内层循环计数
;外层循环
S1:
mov di,si ;每次内部循环回到数组起始位置
add bx,1
cmp bx,10;外层循环结束条件
sub cx,2 ;走过一趟少比较一个数
je E0
;内层循环
S2:
add di,2
mov dx,[di+2];比较俩个数
cmp dx,[di]
ja S3
xchg dx,[di];交换
mov [di+2],dx
;内层循环结束条件
S3:
cmp di,cx
je S1
jmp S2
E0:
pop dx
pop cx
pop bx
pop di
pop si
RET
SORT ENDP
CODES ENDS
END START