Водятся слова через пробел, нужно вывести на экран все слова, укороченные до длинны минимального.
Вот мой неработающий код, не могу найти ошибку:(
.model small
.stack 100h
.data
buffer db 100,101 dup( ? )
Flags db ($-buffer)/2 dup( 0 ) ; признаки выведенного слова, 0 - не выведенно
;$-Buffer = текущий адрес($) - адрес начала Buffer= длина Buffer в байтах
;/2 - количество слов, т.к. минимальная длина слова 1 символ и следом один пробел
Number dw ? ; номер выводимого слова (с 0)
temp dw ?
temp0 dw ?
AdrWord dw ? ; начало выводимого слова
Mes db "Input string: $"
.code
start:
mov ax,@data
mov ds,ax
mov dx,offset Mes
call symbol
call input
call setnewline
mov si,offset Buffer+2
mov cl,Buffer+1
mov ch,0
call Sort
mov ah,08h
int 21h
mov ah,4ch
int 21h
symbol proc
mov ah,09h
int 21h
ret
symbol endp
input proc
mov ah,0ah
mov dx,offset Buffer
int 21h
ret
input endp
setnewline proc
mov ah,02h
mov dl,0Dh
int 21h
mov dl,0Ah
int 21h
ret
setnewline endp
Sort Proc
; Вход SI- начало строки, CX - ее длина
push ax
push bx
push dx
push di
push cx
push si
NewFind: ; поиск слова минимальной длины
pop si
pop cx
push cx
push si
mov dx,256 ; минимальная длина слова
mov bx,-1 ; номер просматриваемого слова (нумерация с 0)
FindBeg: ; пропуск пробелов - поиск начала слова
jcxz endString ; просмотренна вся строка
cmp byte ptr [si],' '
jne BegWord
inc si
dec cx
jmp short FindBeg
BegWord: ; найденно начало слова
inc bx
xor ax,ax ; длина текущего слова
mov di,si ; начало текущего слова
FindEnd: ; поиск конца слова
inc si
inc ax
dec cx
jz EndWord
cmp byte ptr [si],' '
jne FindEnd
EndWord: ; конец слова
cmp byte ptr Flags[bx],0
jne FindBeg ; если слово уже распечатано
cmp ax,dx
ja FindBeg
; текущее слово не распечатывалось и короче ранее найденного
mov Number,bx
mov dx,ax
mov AdrWord,di
jmp FindBeg
endString: ; просмотренна вся строка
cmp dx,256
je BegPrint ; все слова распечатаны
mov bx,Number
mov byte ptr Flags[bx],1 ; пометить что распечатано
mov cx,dx
mov temp,dx
mov si,AdrWord
jmp NewFind
BegPrint:
pop si
pop cx
push cx
push si
xor ax,ax
xor bx,bx
mov temp0,cx
FindBeg1: ; пропуск пробелов - поиск начала слова
; mov cx,temp0
jcxz exit ; просмотренна вся строка
cmp byte ptr [si],' '
jne BegWord1
inc si
dec cx
jmp short FindBeg1
BegWord1: ; найденно начало слова
inc bx
xor ax,ax ; длина текущего слова
mov di,si ; начало текущего слова
FindEnd1: ; поиск конца слова
mov temp0,cx
mov cx,temp
OutChar1:
lodsb
mov dl,al
mov ah,02h
int 21h
loop OutChar1
mov cx,temp0
mov dl,' '
int 21h
inc si
inc ax
dec cx
jz exit
cmp byte ptr [si],' '
jne FindEnd1
jmp FindBeg1
exit:
pop si
pop cx
pop di
pop dx
pop bx
pop ax
ret
Sort endp
end Start