这里的排序,用的是冒泡排序。
首先,先是说一下找非负数的想法,负数“TEST 80H”之后不为0,我们可以用这个性质来做。
;(1)FIND POSITIVE NUMBER
LEA SI, FIRST
LEA DI, SECOND
MOV CX, N
LLP: MOV AL, [SI]
TEST AL, 80H
JNZ GO
MOV [DI], AL
INC DI
INC BL ;BX用来记录有多少正数
GO: INC SI
LOOP LLP
我们可以这样子去实现。
接下去就是排序的做法了,我们可以利用冒泡排序来完成这个,就是N-1次简单的比较就可以完成任务了,每次比较会让从1到N-1的每个元素和后面的比较大小,然后转移即可。
STACK SEGMENT PARA 'STACK'
DB 100 DUP(?)
STACK ENDS
DATA SEGMENT
DATA ENDS
ASSUME DS: SEG1, CS: SEG2
SEG1 SEGMENT
FIRST DB 5, -8, 3, 9, -2, -5, 7, -9, 0, 5, 4, 9, -6, 1, -1, 8, -3, 6, 2, -7, 0, -4
N EQU $-FIRST
SECOND DB 30 DUP(?)
SEG1 ENDS
SEG2 SEGMENT
START:
MOV AX, SEG1
MOV DS, AX
MOV ES, AX
XOR BL, BL
;(1)FIND POSITIVE NUMBER
LEA SI, FIRST
LEA DI, SECOND
MOV CX, N
LLP: MOV AL, [SI]
TEST AL, 80H
JNZ GO
MOV [DI], AL
INC DI
INC BL ;BX用来记录有多少正数
GO: INC SI
LOOP LLP
;(2)SORT SLOVE
DEC BL
;38 ROW
MOV DX, 13
XOR AX, AX ;INIT()
LOP1:
DEC DX
MOV CX, DX
LEA SI, SECOND
LOP2:
MOV AL, [SI]
INC SI
MOV AH, [SI]
CMP AL, AH
JA EXC
LOOP LOP2
EXC: MOV [SI], AL
MOV [SI - 1], AH
LOOP LOP2
CMP DX, 0
JNZ LOP1
LAST:
SEG2 ENDS
END START