assume cs:code,ds:data data segmentmsg1 db 'Before sort:$'crlf db 0dh,0ah,'$'msg2 db 'After sort :$'buff db 16 dup (0) data ends code segmentstart: mov ax,data mov ds,ax mov dx,offset msg1 mov ah,9 int 21h mov cx,0 mov di,offset buff input: mov ah,1 int 21h cmp al,0dh jz ok mov [di],al inc di inc cx cmp cx,16 jz ok jmp input ok: mov dx,offset crlf mov ah,9 int 21h mov dx,offset msg2 mov ah,9 int 21h dec cx mov si,offset buff s: push cx mov di,si inc dis1: mov al,[si] cmp al,[di] jb jx xchg al,[di] mov [si],aljx: inc di loop s1 inc si pop cx loop s mov byte ptr [si+1],24h mov dx,offset buff mov ah,9 int 21h mov ah,4ch int 21h code ends end start 从输入字符串的过程可以看到,最后bx的值等于字符串中最后一个字符的下一个单元的地址,相当于C语言中,A[0]到A[n-1]是你输入的n个字符, 现在BX=n, A[n]中不属于你的字符串了。
冒泡排序的比较中, 若用A[i]与A[i+1]比, 则i的循环范围是0到n-2, i=n-1时, A[i+1]没意义.
所以你的程序中, 下面的程序段有问题:
ADD SI,1 ;准备比较下一组数
CMP SI,BX
JGE ADD_DI
JMP COMPARE
相当于
for(i=0; i<n; i++)
if(A[i]>A[i+1]) ......
上一页 [1] [2]