当前位置:文档之家› 微机原理汇编语言冒泡排序

微机原理汇编语言冒泡排序

对下面十个数进行冒泡排序:
5,2,1,0,2,3,8,6,5,9

代码段
DATA SEGMENT

DAT DB 5,2,1,0,2,3,8,6,5,9

COUNT DB 10,10

DATA ENDS

;

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA

START:MOV AX,DATA

MOV DS,AX

MOV ES,AX

MOV BL,1

LP1: CMP BL,0

JE LP4

XOR BL,BL

MOV CL,COUNT

DEC CL



push cx

LEA DI,DAT

LP2:MOV AL,[DI]

CMP AL,[DI+1]

JLE LP3

XCHG [DI+1],AL

MOV [DI],AL

MOV BL,1

LP3:INC DI

LOOP LP2

pop cx

mov count,cl

JMP LP1



LP4:MOV CL,10

LEA DI,DAT

SC:MOV AX,0

MOV BH,2

MOV AL,[DI] ;取数

CMP AL,0 ;如果是正数则跳

JGE NEXT

NEG AL ;如果是负数 先将 al中的负数取补转成对应的 正数

push ax

MOV AH,02H ;同时显示 负数的标记 '-'

MOV DL,'-' ;注意这个时候 ax 的值会因为 21h中断的调用而改变:) 所以先要保存起来

INT 21H ;就是说 int 21h 中断将会有一个返回值

pop ax ;以前我也出现过一样的问题,后来调试的时候才发现原来某些中断之后ax会改变

NEXT:XOR AH,AH

DIV COUNT+1 ;除以 10 取 十位

MOV DH,AH ;ah 是余数 al 是商

ADD AL,30H

MOV DL,AL

MOV AH,02H

INT 21H ;显示 十位上的数值(如果只是两位数的话)

MOV AL,DH

XOR AH,AH

; DIV COUNT+1 ;这为什么还要除以10?如果说是处理3位数的话,应该把商除10而不是把余数除10

ADD AX,3030H

MOV DL,AL ;所以最好在显示时 判断是否是 大于 100 或者 小于 100 再根据判断结果来处理 DIV

; MOV BL,AH ;AH才是所要的,故不应该再打印 AL(商)值了, 总之这里在处理 位数的显示时有点问题



;在这里,如果是2位数可以正确显示如果是3位则不能,所以最后的125显成了 <5

OUTP: MOV AH,2

INT 21H

DEC BH

JZ XT

MOV DL,BL ;显示个位数

JMP OUTP

XT: DEC CL

JZ DONE

INC DI

JMP SC

DONE: MOV AH,4CH

INT 21H

CODE ENDS

END START

相关主题
文本预览
相关文档 最新文档