把列出的数从大到小排列,有一个错误,我实在是找不出来了。
DSEG SEGMENT
BUFFER DB 23,12,45,32,127,3,9,58,81,72
N EQU 10
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
START:MOV AX,DSEG
MOV DS,AX
MOV BX,OFFSET BUFFER
MOV SI,1
ABC:
MOV SI,BX+1
A:
MOV AL,[BX]
CMP AL,[BX+SI]
JBE B
XCHG AL,[BX+SI]
MOV [BX],AL
B:
INC SI
CMP SI,N
JBE A
INC BX
CMP BX,N-1
JBE ABC
MOV AH,4CH
INT 21H
CSEG ENDS
END START
DSEG SEGMENT
BUFFER DB 23,12,45,32,127,3,9,58,81,72
;BUFFER DB 2,4,6,8,10,1,3,5,7,9;这组数据更容易明白过程
;N EQU 9
N DW 10 ;这个数是要逐渐减少地
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
START: MOV AX,DSEG
MOV DS,AX
MOV BX,OFFSET BUFFER
XOR SI,SI
MOV AL,[BX]
A: CMP AL,[BX+SI]
JB B
MOV DI,SI
MOV AL,[BX+SI]
B: INC SI
CMP SI,N
JB A
;INT 3这个测试点可以看到最小的值
MOV AH,[BX+DI]
MOV AL,[BX]
MOV [BX+DI],AL
MOV [BX],AH
INC BX
XOR SI,SI
MOV AL,[BX+SI]
DEC N
JNZ A
INT 3;此处停下能看到结果。
MOV AH,4CH
INT 21H
CSEG ENDS
END START
这个是选择排序的程序,不知道是否是要的,你原来的代码没看明白到底要什么算法。
DSEG SEGMENT
BUFFER DB 23,12,45,32,127,3,9,58,81,72
N EQU 10
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
START:MOV AX,DSEG
MOV DS,AX
MOV BX,OFFSET BUFFER
MOV SI,1
ABC:
MOV SI,BX+1 ;在汇编里是不能直接把bx+1赋值给另一个寄存器的,比如你能够这样做:
;mov dx,bx inc dx mov si,dx 这样既不改变bx也能达到目的。
;我只指出了这个错误,你改过来后再调试下,你这个程序好像还有逻辑错误
;程序能运行,但是不能得到正确结果,请你自己再思考一下
A:
MOV AL,[BX]
CMP AL,[BX+SI]
JBE B
XCHG AL,[BX+SI]
MOV [BX],AL
B:
INC SI
CMP SI,N
JBE A
INC BX
CMP BX,N-1
JBE ABC
MOV AH,4CH
INT 21H
CSEG ENDS
END START