题目是:输入一个字符串,然后对每个字符进行冒泡排序,最后输出一个按字符从小到大排序的字符串!
以下是我写的代码,不知道哪里出问题了,请高手指点一下,万分感激!!
DATA SEGMENT
STRING1 DB 100 DUP(?) ;输入的字符串
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
LEA BX, STRING1 ; 把string1的地址赋给BX
MOV AH, 1
SCANF:
INT 21H ;获得按键的ASCII代码值,即输入
CMP AL, 13 ;如果回车则停止输入
JZ END_SCANF ;输入完毕
MOV [BX], AL ;把每一个字符存入[BX]即string1中
ADD BX, 1 ;BX下移,准备存入下个字符
JMP SCANF ;继续输入直到回车
END_SCANF: MOV DI,OFFSET STRING1 ;冒泡的次数
MOV SI,OFFSET STRING1 ;一次冒泡的过程
COMPARE: MOV AL,[SI]
CMP AL,BYTE PTR[SI+1]
JGE EXCHANGE ;如果大于后一个,则两数交换
ADD SI,1
CMP SI,BX
JGE ADD_DI ;已比到最后一个数,则进行下一次的冒泡
JMP COMPARE ;否则继续比较下一组数
EXCHANGE: MOV AL ,[SI]
XCHG AL,[SI+1]
MOV [SI],AL ;交换两数的值
ADD SI,1 ;准备比较下一组数
CMP SI,BX
JGE ADD_DI
JMP COMPARE
ADD_DI: ADD DI,1
CMP DI,BX
JGE PRINT
MOV SI,DI
JMP COMPARE
PRINT: MOV BYTE PTR [BX],'$' ;加入美元结束符号
MOV AH,9
LEA DX,STRING1
INT 21H ;输出排完序后的字符串
MOV AX, 4C00H ;安全退出程序返回dos
INT 21H
CODE ENDS
END START
ADD_DI:
ADD DI,1
CMP DI,BX
JGE PRINT
MOV SI,DI
JMP COMPARE
这是什么
MOV BYTE PTR [BX],'$' 这不把最后一个单元内容冲掉了么