.386
DATA SEGMENT USE16
BUF1 DB 15 DUP(0)
BUF DD 123,0, -100, -50,300
N = ($-BUF)/4
DATA ENDS
STACK SEGMENT USE16 STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT USE16
ASSUME DS:DATA,SS:STACK,CS:CODE
START: MOV AX,DATA
MOV DS,AX
MOV CX,N
LEA SI,BUF
CALL QUEUE
LOPA: MOV EAX,[DI]
MOV DX,32
CALL F2T10
MOV DL,'/'
MOV AH,2
INT 21H
ADD DI,4
LOOP LOPA
MOV AH,4CH
INT 21H
F2T10 PROC FAR
PUSH EBX
PUSH SI
LEA SI,BUF1
CMP DX,32
JE B
MOVSX EAX,AX
B: OR EAX,EAX
CMP EAX,0
JGE PLUS
NEG EAX
MOV BYTE PTR [SI],'-'
INC SI
PLUS: MOV EBX,10
CALL RADIX
MOV BYTE PTR [SI],'$'
LEA DX,BUF1
MOV AH,9
INT 21H
POP SI
POP EBX
RET
F2T10 ENDP
RADIX PROC
PUSH CX
PUSH EDX
XOR CX,CX
LOP1: XOR EDX,EDX
DIV EBX
PUSH DX
INC CX
OR EAX,EAX
JNZ LOP1
LOP2: POP AX
CMP AL,10
JL L1
ADD AL,7
L1: ADD AL,30H
MOV [SI],AL
INC SI
LOOP LOP2
POP EDX
POP CX
RET
RADIX ENDP
QUEUE PROC
PUSH EAX
PUSH DX
PUSH DI
MOV DI,SI
DEC CX
QU1: MOV DX,CX
MOV SI,DI
QU2: MOV EAX,[SI]
CMP EAX,[SI+4]
JG NOXCH
XCHG [SI+4],EAX
MOV [SI],EAX
NOXCH: ADD SI,4
DEC DX
JNE QU2
LOOP QU1
POP DI
POP DX
POP EAX
RET
QUEUE ENDP
CODE ENDS
END START
这个程序是将BUF中的数转化成10进制从大到小排序后用字符串显示,显示部分的代码没有问题,但就是冒泡排序的子程序QUEUE一加进去就全乱了。。。超多的数刷屏,看了半天也不明白在哪错了。刚学汇编,希望大神指点一下!
------解决方案--------------------
QUEUE 子程破坏了 cx 吧,另外,di 也要设置;或者,干脆在显示循环前再重新设置下 cx 和 di 了。