汇编语言实现快速冒泡排序

汇编语言实现快速冒泡排序,第1张

DATAS SEGMENT

DATA DB 24,18,-8,-16,66,56,86,6,10,98

COUNT DB 10,10

DATAS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,ES:DATAS

START:

MOV AX,DATAS

MOV DS,AX

MOV ES,AX

MOV BL,1 改进版本,用BL来检验是否排序完成,减少循环次数

LOOP1:

CMP BL,0

JE DATAOUT ZF=1,若相等或为0,则跳转

XOR BL,BL 用逻辑异或将BL清零

MOV CL,COUNT COUNT用于外层的计数

DEC CL CL减一,CL用于内层的计数

PUSH CX 将CX压入堆栈

LEA DI,DATA 将数据段首地址赋值给DI

LOOP2:

MOV AL,[DI]

CMP AL,[DI+1] 将前一个数与后一个数比较

JLE LOOP3 ZF=1或SF!=OF 若前一个数小于或等于后一个数,则跳转到LOOP3

XCHG [DI+1],AL 前者大于后者,则交换两数

MOV [DI],AL 如果前一个数字大于后一个数字,则交换

MOV BL,1

LOOP3:

INC DI 指针加一

LOOP LOOP2 循环L00P2,直到CX==0成立

POP CX 将CX从堆栈中d出

MOV COUNT,CL 改变外层计数器的值

JMP LOOP1

DATAOUT:

MOV CL,10 开始数据输出

LEA DI,DATA 载入数据段(数组)首地址

NEXT:

MOV AX,0 输出下一个数

MOV BH,2 输出的数字之间的空格

MOV AL,[DI] 取数

CMP AL,0

JGE NON 如果是非负数,则跳至NON

NEG AL 若是负数,将AL中的负数取补转成对应的正数

PUSH AX INT 21H 中断将会有一个返回值

MOV AH,2 同时显示负数的标记‘-’

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

INT 21H 若是负数,在屏幕上显示‘-’号

POP AX 某些中断之后AX会改变

NON: XOR AH,AH 将AH清零

DIV COUNT+1 除以10取十位

MOV DH,AH AH是余数,AL是商(如果是个位数,则AL为零)

CMP AL,0

JE SINGLE 如果AL为零(个位数),则跳转到DIR,直接输出十位数

ADD AL,30H 将数字转换成ASC码

MOV DL,AL 数字放入DL,在屏幕输出

MOV AH,2

INT 21H 显示十位上的数值

SINGLE:

MOV AL,DH 将余数(个位数)放入AL

XOR AH,AH 将AH清零

ADD AX,3030H

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

OUTP:MOV AH,2 显示输出功能

INT 21H 显示个位数

DEC BH BH减一

JZ XT 若相等或为0,则跳转

MOV DL,BL BL为零,屏幕输出空格

JMP OUTP

XT: DEC CL 输出数组下一个

JZ DONE 如果ZF标志位为零(CL为零),则程序完成

INC DI 数组指针+1

JMP NEXT 继续输出数组下一个数

DONE: MOV AH,1 键盘输入并回显功能,目的是使程序输出窗口暂停,以便看到输出结果

INT 21H

MOV AH,4CH 带返回码结束功能

INT 21H 返回系统

CODES ENDS

END START

以下是冒泡排序子程序,可直接调用:

(请设置es与ds相同)

===============================

 字数组排序(有符号数冒泡排序)

    SORTWORD  PROC      NEAR

       数组长度置入cx,数组首地址置入 si

              PUSH      AX

              PUSH      CX

              PUSH      DX

              PUSH      SI

              PUSH      DI

              PUSHF

              PUSH      CX

              POP       DX

              DEC       DX

   @SORTWL1:

              MOV       CX,DX

              MOV       DI,SI

   @SORTWL2:

              MOV       AX,[DI+2]

              CMP       AX,[DI]

              JL        @SORTWNEXT   从大到小(无符号换成 JB)

              XCHG      AX,[DI]

              MOV       [DI+2],AX

 @SORTWNEXT:

              INC       DI

              INC       DI

              LOOP      @SORTWL2

              DEC       DX

              JNZ       @SORTWL1

              POPF

              POP       DI

              POP       SI

              POP       DX

              POP       CX

              POP       AX

              RET

    SORTWORD  ENDP

===============================================

 字节数组排序(有符号数冒泡排序)

    SORTBYTE  PROC      NEAR

       数组长度置入cx,数组首地址置入 si

              PUSH      AX

              PUSH      CX

              PUSH      DX

              PUSH      SI

              PUSH      DI

              PUSHF

              PUSH      CX

              POP       DX

              DEC       DX

   @SORTBL1:

              MOV       CX,DX

              MOV       DI,SI

   @SORTBL2:

              MOV       AL,[DI+1]

              CMP       AL,[DI]

              JL        @SORTBNEXT   从大到小(无符号换成 JB)

              XCHG      AL,[DI]

              MOV       [DI+1],AL

 @SORTBNEXT:

              INC       DI

              LOOP      @SORTBL2

              DEC       DX

              JNZ       @SORTBL1

              POPF

              POP       DI

              POP       SI

              POP       DX

              POP       CX

              POP       AX

              RET

    SORTBYTE  ENDP

===============================================


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7761785.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存