|
;从输入有符号的10进制数,将其排序并输出,可是输出结果不对,还请各位老师错在哪了?
M_DIRECT MACRO STRING ;定义一个宏,调用09号DOS功能在屏幕上显示一个字符串
MOV DX,OFFSET STRING
MOV AH,09
INT 21H
ENDM
DATA SEGMENT
COUNT_NUM DB 'The count of numbers to sort:$' ;提示输入要排序的数据的个数
INMSG DB 'Please input the sorting numbers:',0dh,0ah,'$' ;提示输入要排序的数据
OUTMSG DB 'The sorting result:',0dh,0ah,'$' ;在屏幕上提示排好续的数据
COUNT = 100
WTEMP DW ?
ARRAY DW COUNT DUP(?) ;用来保存输入的数据
CRLF DB 13,10,'$' ;实现回车换行的功能,13→0DH,回车;10→0AH,换行
LEN DW ? ;保存实际输入的数据的个数
DATA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA
;************************************************************************************************
START:
PUSH DS
SUB AX,AX ;置AX为0
PUSH AX
MOV AX,DATA ;将数据段的地址送到DX中
MOV DS,AX
M_DIRECT COUNT_NUM ;宏调用,在屏幕上提示输入要输入的数据的个数
CALL READ ;调用子程序P-GETNEW,输入要输入的数据的个数
MOV CX,AX
MOV LEN,AX
LEA BX,ARRAY
MOV AH,09 ;调用09号功能,实现回车换行
LEA DX,CRLF
INT 21H ;屏幕提示输入要排序的数据
M_DIRECT INMSG
GETNUMBER: ;输入数据保存到ARRAY中
CALL READ
MOV [BX+SI],DX
ADD SI ,2
LOOP GETNUMBER
SORT: ;调用SORT子程序排序
CALL data_SORT
MOV AH,09
LEA DX,CRLF
INT 21H
M_DIRECT OUTMSG
CALL OUTPUT ;输出排好序的数据
;RET
MAIN ENDP
;****************************************************************************************
;读入数据
;******************************************************************************************
READ PROC ;从键盘上输入一个数据的子程序
PUSH BX
PUSH CX
PUSH DX
XOR BX,BX
XOR CX,CX
MOV AH,1
INT 21H
CMP AL,'+'
JZ READ1
CMP AL,'-'
JNZ READ2
MOV CX,-1
READ1: MOV AH,1
INT 21H
READ2: CMP AL,'0'
JB READ3
CMP AL,'9'
JA READ3
SUB AL,30H
SHL BX,1
SHL BX,1
ADD BX,DX
MOV AH,0
ADD BX,AX
JMP READ1
READ3: CMP CX,0
JZ READ4
NEG BX
READ4: MOV AX,BX
POP DX
POP CX
POP BX
RET
READ ENDP
;*******************************************************************************************
;排序子程序
;********************************************************************************************
data_SORT PROC
PUSH BX
PUSH CX
PUSH DX
MOV SI,OFFSET LEN
MOV CX,[SI]
mov ax,data
mov ds,ax
;MOV SI,OFFSET ARRAY
;MOV DX,[SI]
;mov cx,4
dec cx
mov bx,0
mov si,0
you: mov di,cx
mov ax,array[si]
mov bx,si
twop: cmp ax,array[bx+2]
jle on1
mov ax,array[bx+2]
mov dx,bx
inc dx
inc dx
on1: inc bx
inc bx
dec di
cmp di,0
jnz twop
xchg ax,array[si]
mov bx,dx
mov array[bx],ax
inc si
inc si
loop you
;mov ah,4ch
;int 21h
POP DX
POP CX
POP BX
data_SORT ENDP
;************************************************************************************
;数据输出
;**************************************************************************************
OUTPUT PROC ;数据输出子程序
MOV CX,LEN
MOV BX,OFFSET ARRAY
AGAIN: MOV AX,[BX]
MOV WTEMP,AX
JMP WRITE
ADD BX,2
MOV AH,09H
LEA DX,CRLF
INT 21H
LOOP AGAIN
WRITE: PUSH AX
PUSH BX
PUSH DX
MOV AX,WTEMP
TEST AX,80h;AX
JNZ WRITE1
MOV DL,'0'
MOV AH,2
INT 21H
JMP WRITE5
WRITE1: JNS WRITE2
MOV BX,AX
MOV DL,'-'
MOV AH,2
INT 21H
MOV AX,BX
NEG AX
WRITE2: MOV BX,10
PUSH BX
WRITE3: CMP AX,0
JZ WRITE4
SUB DX,DX
DIV BX
ADD DL,30H
PUSH DX
JMP WRITE3
WRITE4: POP DX
CMP DL,10
JE WRITE5
MOV AH,2
INT 21H
JMP WRITE4
WRITE5: POP DX
POP BX
POP AX
RET
OUTPUT ENDP
;****************************************************************************
;*****************************************************************************
CODE ENDS
END START |
|