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
我想在 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