大虾帮帮忙 一个排序问题

zhao007z4 2007-01-10 08:41:25
请问怎么更改下面代码,能在屏幕上得到一个正确由小到大排序的答案。
程序代码:
CRLF MACRO
MOV AH,02H
MOV DL,0DH
INT 21H
MOV AH,02H
MOV DL,0AH
INT 21H
ENDM
DATA SEGMENT
SORTNUM EQU 9
MESS1 DB 'INPUT SEGMENT VALUE:$'
MESS2 DB 'INPUT SEGMENT VALUE:$'
MESS3 DB 'SORT OK!',0DH,0AH,'$'
ERROR DB 'INPUT ERROR!',0DH,0AH,'$'
DATA ENDS
STACK SEGMENT
STA DW 32 DUP (?)
TOP DW ?
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
mov ES,AX
MOV AX,STACK
MOV SS,AX
MOV AX,TOP
MOV SP,AX
MOV AH,09H
MOV DX,OFFSET MESS1
INT 21H
CALL GETNUM
MOV ES,DX
CRLF
MOV AH,09H
MOV DX,OFFSET MESS2
INT 21H
CALL GETNUM
MOV SI,DX
PUSH ES
POP DS
MOV CX,SORTNUM
DEC CX
XOR BX,BX
III: MOV AL,[SI+BX]
MOV AH,BL
PUSH CX
MOV CX,SORTNUM
SUB CX,BX
DEC CX
MOV DX,BX
JJJ: INC DX
MOV BX,DX
CMP AL,[SI+BX]
JBE UUU
MOV AL,[SI+BX]
MOV AH,DL
UUU: POP BX
LOOP JJJ
MOV CL,[SI+BX]
MOV [SI+BX],AL
MOV DL,AH
PUSH BX
MOV BX,DX
MOV [SI+BX],CL
POP BX
INC BX
POP CX
LOOP III
PUSH DS
MOV AX,DATA
MOV DS,AX
MOV AH,09H
MOV DX,OFFSET MESS3
INT 21H
POP DS
MOV CX,SORTNUM
VVV: MOV AL,[SI]
CALL DISPL
CRLF
INC SI
LOOP VVV
MOV AX,4C00H
INT 21H
DISP1 PROC NEAR
PUSH CX
MOV BL,AL
MOV DL,BL
MOV CL,04
ROL DL,CL
AND DL,0FH
CALL DISP1
MOV DL,BL
AND DL,0FH
CALL DISPL
POP CX
RET
DISP1 ENDP
DISPL PROC NEAR
ADD DL,30H
CMP DL,3AH
JB DDD
ADD DL,27H
DDD: MOV AH,02H
INT 21H
RET
DISPL ENDP
GETNUM PROC NEAR
PUSH CX
XOR DX,DX
GGG: MOV AH,01H
INT 21H
CMP AL,0DH
JZ PPP
CMP AL,20H
JZ PPP
SUB AL,30H
JB KKK
CMP AL,0AH
JB GETS
CMP AL,11H
JB KKK
SUB AL,07H
CMP AL,0FH
JBE GETS
CMP AL,2AH
JB KKK
CMP AL,2FH
JA KKK
SUB AL,20H
GETS: MOV CL,04
SHL DX,CL
XOR AH,AH
ADD DX,AX
JMP GGG
KKK: MOV AH,09H
MOV DX,OFFSET ERROR
INT 21H
PPP: PUSH DX
CRLF
POP DX
POP CX
RET
GETNUM ENDP
CODE ENDS
END START
...全文
424 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjz706 2007-10-12
  • 打赏
  • 举报
回复
聊聊思路就ok了,干嘛帖这么多代码,
gallanthunter 2007-01-17
  • 打赏
  • 举报
回复
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;用冒泡法排序的子程序(从大到小)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;P_SORT PROC

;RET ;子程序返回
;P_SORT ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;数据输出子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
P_OUTPUT PROC
PUSH AX ;入口参数:共享变量WTEMP
PUSH BX
PUSH DX
MOV AX,WTEMP ;取出显示的数据
TEST AX,AX ;判断数据是零、正书还是负数
JNZ WRITE1
MOV DL,'0' ;是‘0’,显示‘0’后退出
MOV AH,2
INT 21H
JMP WRITE5

WRITE1: JNS WRITE2 ;是负数,显示“-”
MOV BX,AX ;AX数据暂存于BX
MOV DL,'-'
MOV AH,2
INT 21H
MOV AX,BX
NEG AX ;数据求补(绝对值)

WRITE2: MOV BX,10
PUSH BX ;10压入堆栈,做为推退出标志

WRITE3: CMP AX,0 ;数据(商)为零,转向显示
JZ WRITE4
SUB DX,DX ;扩展被除数DX.AX
DIV BX ;数据除以10
ADD DL,30H ;余数(0~9)转换为ASCⅡ码
PUSH DX ;数据各位先低位后高位压入堆栈
JMP WRITE3

WRITE4: POP DX ;数据各位先高位后低位弹出堆栈
CMP DL,10 ;是结束标志10,则退出
JE WRITE5

MOV AH,2 ;进行显示
INT 21H
JMP WRITE4

WRITE5: POP DX
POP BX
POP AX
MOV DL,20H
MOV AH,02H
INT 21H
RET ;子程序返回
P_OUTPUT ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CODE ENDS
END START


gallanthunter 2007-01-17
  • 打赏
  • 举报
回复
你的好象不能运行,看看我的
;题目:编制一个完整的汇编语言程序,从键盘上读入若干个(可以超过十个)十进制数(正数),排序后在屏幕上输出。
;采用冒泡法排序,综合运用子程序和宏汇编,使程序模块化。
;程序代码
M_DIRECT MACRO STRING ;定义一个宏,调用09号DOS功能在屏幕上显示一个字符串
MOV DX,OFFSET STRING
MOV AH,09
INT 21H
ENDM

DATA SEGMENT
DIR1 DB 'count of numbers to sort:$' ;提示输入要排序的数据的个数
DIR2 DB 'please input sorting numbers:$';提示输入要排序的数据
DIR3 DB 'sorting result:$' ;在屏幕上提示排好续的数据
DIR4 DB '*************************$'
DIR5 DB 'please choose u(up)ord(down):$'
DIR6 DB 'input error$'
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

READ: M_DIRECT DIR1 ;宏调用,在屏幕上提示输入要输入的数据的个数

CALL P_GETNEW ;调用子程序P-GETNEW,输入要输入的数据的个数
MOV CX,AX
MOV LEN,AX
LEA BX,ARRAY
MOV AH,09 ;调用09号功能,实现回车换行
LEA DX,CRLF
INT 21H ;屏幕提示输入要排序的数据
M_DIRECT DIR2

GETNUMBER: CALL P_GETNEW ;输入数据并保存到ARRAY中


MOV [BX],AX
ADD BX ,2
LOOP GETNUMBER

SORT: MOV CX,LEN ;排序程序部分
DEC CX

MOV AH,09H
LEA DX,CRLF
INT 21H

M_DIRECT DIR5

COMPARE:MOV AH,01H
INT 21H

CMP AL,'U' ;判断是升序排序还是降序排序
JZ UP ;输入的字符是U或u跳转到升序排序程序
CMP AL,'u'
JZ UP

CMP AL,'D' ;输入的字符是D或d跳转到降叙排序程序
JZ DOWN
CMP AL,'d'
JZ DOWN

UP: MOV DI,CX ;升序排序程序
MOV BX,0

LOOP1: MOV AX,ARRAY[BX]
CMP AX,ARRAY[BX+2]
JNGE CONTINUE1
XCHG AX,ARRAY[BX+2]
MOV ARRAY[BX],AX

CONTINUE1: ADD BX,2
LOOP LOOP1
MOV CX,DI
LOOP UP
JMP OUTPUT ;排序完后跳转到输出程序部分

DOWN: MOV DI,CX ;降序排序程序
MOV BX,0

LOOP2: MOV AX,ARRAY[BX]
CMP AX,ARRAY[BX+2]
JGE CONTINUE2
XCHG AX,ARRAY[BX+2]
MOV ARRAY[BX],AX

CONTINUE2: ADD BX,2
LOOP LOOP2
MOV CX,DI
LOOP DOWN
JMP OUTPUT ;排序完后跳转到输出程序部分

OUTPUT: MOV AH,09 ;回车换行
LEA DX,CRLF
INT 21H
M_DIRECT DIR3

MOV CX,LEN ;为输出程序设置好入口参数
MOV BX,OFFSET ARRAY

WRITE: MOV AX,[BX] ;输出排好序的数据
MOV WTEMP,AX ;将入口参数存放到共享变量中

CALL P_OUTPUT

ADD BX,2
MOV DL,20H ;显示空格,将两个输出的数据分开
MOV AH,02H
INT 21H
LOOP WRITE

MOV AH,09 ;隔离两次输入排序输出的作用
LEA DX,CRLF
INT 21H
M_DIRECT DIR4

MOV AH,09 ;实现循环输入数据并排序输出
LEA DX,CRLF
INT 21H
LOOP READ
RET

MAIN ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;从键盘上输入一个数据的子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
P_GETNEW PROC
PUSH BX ;出口参数:AX=补码表示的二进制数
PUSH CX ;说明:负数用“-”引导,数据范围是+32767~-32768
PUSH DX
XOR BX,BX ;BX保存结果
XOR CX,CX ;CX为正负标志,0为正,-1为负
MOV AH,1 ;输入一个字符
INT 21H
CMP AL,'+' ;是“+”,继续输入字符
JZ READ1
CMP AL,'-' ;是“—,设置-1标志
JNZ READ2
MOV CX,-1

READ1: MOV AH,1 ;继续输入字符
INT 21H

READ2: CMP AL,'0' ;不是0~9之间的字符,则输入数据结束
JB READ3
CMP AL,'9'
JA READ3
SUB AL,30H ;是0~9之间的字符,则转换为二进制数
;利用移位指令,实现数值乘10:BX←BX*10
SHL BX,1
MOV DX,BX
SHL BX,1
SHL BX,1
ADD BX,DX

MOV AH,0
ADD BX,AX ;已输入数值乘10后,与新输入的数值相加
JMP READ1 ;继续输入字符

READ3: CMP CX,0 ;是负数,进行求补
JZ READ4
NEG BX

READ4: MOV AX,BX ;设置出口参数
POP DX
POP CX
POP BX
RET ;子程序返回
P_GETNEW ENDP

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧