Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Найти слово минимальной длинны и укоротить остальные до длинны минимального.  (Прочитано 4151 раз)
0 Пользователей и 1 Гость смотрят эту тему.
k4tr1n
Новенький

ru
Offline Offline

« : 07-06-2012 13:55 » 

Водятся слова через пробел, нужно вывести на экран все слова, укороченные до длинны минимального.
Вот мой неработающий код, не могу найти ошибку:(
Код: (ASM)
.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
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines