MASM611 - 冒泡排序给出意想不到的输出

MASM611 - Bubble Sort giving unexpected output

我想在 MASM611 中使用冒泡排序对以下数字进行排序:

59H, 39H, 51H, 57H, 24H, 86H, 95H, 93H, 15H, 75H, 42H, 68H, 03H, 06H, 01H

我编写的代码适用于所有小于 80 的十六进制数。但如果数组中有一个大于 80H 的数字,则将其放在开头。

谁能指出我的错误或对这种奇怪的行为给出任何解决方案。 PS:我是汇编新手。

代码:

ASSUME CS:CODE, DS:DATA

DATA SEGMENT
    ORG 1200H
    ARRAY DB 59H, 39H, 51H, 57H, 24H, 86H, 95H, 93H, 15H, 75H, 42H, 68H, 03H, 06H, 01H
    count equ 15
DATA ENDS

CODE SEGMENT
START:
    MOV AX, DATA
    MOV DS, AX

    MOV DX, COUNT-1
    OLOOP:
        MOV CX, COUNT-1
        LEA SI, ARRAY

        ILOOP:
            MOV AL, [SI]
            CMP AL, [SI+1]
            JL KEEP
            XCHG AL, [SI+1]
            MOV [SI], AL

            KEEP:
                INC SI
                LOOP ILOOP

        DEC DX
        JNZ OLOOP

HLT
CODE ENDS
END START

调试:

当数组有大于80的十六进制数时:

大于80H的数字已经排在01H之前了(但86H、93H、95H这三个数字仍然是升序排列)。

当数组有小于80的十六进制数时:

当数组中没有十六进制数时,输出符合预期。

ARRAY DB 59H, 39H, 51H, 57H, 24H, 86H, 95H, 93H, 15H, 75H, 42H, 68H, 03H, 06H, 01H

在处理这个字节数组时,您必须决定需要如何解释这些字节。
您可以以无符号方式处理它们,它们的值范围为 0 到 255, 您可以以有符号方式处理它们,它们的值范围为 -128 到 +127 .您的代码片段使用 jl (JumpOnLess) 指令告诉我们您(故意?)更喜欢签名方式。因为像 86h、95h 和 93h 这样的值代表负数(当被视为有符号数时),所以这种升序排序将把它们放在第一位。

如果你想对无符号数组进行排序,那么只需使用 jb (JumpOnBelow) 指令。


冒泡排序的一次优化

内部循环可以从一个更小的计数器开始,因为当前迭代的最后一个元素将到达其最终目的地。

变化:

OLOOP:
    MOV CX, COUNT-1

进入

OLOOP:
    MOV CX, DX