Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2012, 14:15   #1
iLOL
Пользователь
 
Регистрация: 20.05.2012
Сообщений: 12
Вопрос Сортировка слов вводимых через буфер (TASM)

В общем задача такова: нужно написать процедуру, сортирующую слова в предложении в порядке неубывания их длин. Предложение состоит из слов, разделённых пробелами, и вводится через буфер (ф-ция 0Ah 21 прерывания).
Ввод вывод у меня есть, могу даже получить длину каждого слова в отдельности. Не знаю как отсортировать правильно, вот и прошу помощи)

Код:
.model small
.data
	buffer							db						31,32 dup( ? )
	lens							dw						30 dup( ? )
	nums							dw						30 dup( ? )
	min								dw						? 
	EnterSentence					db						"Введите предложение:  $"
.stack 100h
.code
start:
assume ds:@data,es:@data
mov ax,@data
mov ds,ax
mov es,ax

lea		dx,EnterSentence
call            print_string
call            value_input
call            cmp_strlen
call            waiting

mov			ah,4ch
int			21h
...
cmp_strlen		proc
	mov			si,offset buffer+2
	xor			di,di
	xor			cx,cx
begn_st:	
	cmp byte ptr [si],0Dh
	je mass_st
	cmp byte ptr [si],' '
	je nxt_st
	inc cx ;длина слова
	inc si
	jmp begn_st
nxt_st:
	mov lens[di],cx
	inc di ;колво слов
	mov nums[di-1],di
	xor cx,cx
	inc si
	cmp byte ptr [si],0Dh
	jne begn_st
	xor si,si
mass_st:
;сделаем вывод массива для проверки
xor si,si
mov cx,di
l4:
	mov ax,nums[si]
	call output_num
	mov dl,' '
	call symbol
	mov ax,lens[si]
	call output_num
	mov dl,' '
	call symbol
	inc si
	loop l4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	xor si,si
	xor bx,bx
	xor ax,ax
	xor cx,cx
;СОРТИРОВКА
	mov cx,di
	dec di
cmp_st:
	push cx
	mov si,0
	mov cx,di
sort:
	mov bx,lens[si]
	cmp bx,lens[si+1]
	jbe nxt
	xchg bx,lens[si+1]
	mov lens[si],bx
	mov ax,nums[si]
	xchg ax,nums[si+1]
	mov nums[si],ax
nxt:inc si
	loop sort
	pop cx
	loop cmp_st
;;;;;;;;;;;;;
;сделаем вывод массива для проверки
xor si,si
inc di
mov cx,di
l3:
	mov ax,nums[si]
	call output_num
	mov dl,' '
	call symbol
	mov ax,lens[si]
	call output_num
	mov dl,' '
	call symbol
	inc si
	loop l3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;	
	
	xor di,di
	xor si,si
	xor bx,bx
	mov si,offset buffer+2
l2:
	cmp byte ptr [si],0Dh
	je ext ;je ext
	cmp byte ptr [si],' '
	jne notok
inc_st:
	cmp bx,lens[di]
	jne notcmp
	mov cx,bx
	sub si,bx
okay:
	mov dl,byte ptr [si]
	call symbol
	inc si
	loop okay
	mov dl,byte ptr [si]
	call symbol
	inc si
	xor bx,bx
	xor cx,cx
	inc di
	jmp l2
notok:
	inc bx
	inc si
	jmp l2
notcmp:
	inc di
	jmp inc_st
ext:ret
cmp_strlen			endp
	
	;я хз ваще, выше надо сделать вывод посимвольно слов в нужном порядке(
...
iLOL вне форума Ответить с цитированием
Старый 20.05.2012, 15:04   #2
iLOL
Пользователь
 
Регистрация: 20.05.2012
Сообщений: 12
По умолчанию

Вход: qwerty asdf zxcvb
Выход: 1 6 2 4 3 5 3 5 0 0 3 5 qwerty asdf zxcvb
Как видно не срабатывает сортировка и последующий вывод.
Может есть предложения как вообще по другому отсортировать (не используя 2 доп. массива) ?
iLOL вне форума Ответить с цитированием
Старый 20.05.2012, 17:57   #3
iLOL
Пользователь
 
Регистрация: 20.05.2012
Сообщений: 12
По умолчанию

Апец (10 раз)
iLOL вне форума Ответить с цитированием
Старый 20.05.2012, 19:39   #4
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

что должно являться результатом работы процедуры: новая строка, текущая с переставленными словами или вывод на экран?
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 20.05.2012, 19:49   #5
iLOL
Пользователь
 
Регистрация: 20.05.2012
Сообщений: 12
По умолчанию

Не важно. Можно просто вывести результат. Главное чтоб он отобразился на экране
iLOL вне форума Ответить с цитированием
Старый 20.05.2012, 21:20   #6
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

как вариант ...
Код:
.model small
.stack 100h

.data
buffer      db      31,32 dup( ? )
Flags       db      ($-Buffer)/2 dup( 0 )   ; признаки выведенного слова, 0 - не выведенно
Number      dw      ?                       ; номер выводимого слова (с 0)
AdrWord     dw      ?                       ; начало выводимого слова
Mes         db      "Input string:  $"
.code
start:
            mov   ax,@data
            mov   ds,ax

            lea   dx,Mes
            mov   ah,9
            int   21h
            mov   ah,0ah
            lea   dx,Buffer
            int   21h
            mov   ah,2
            mov   dl,13
            int   21h
            mov   dl,10
            int   21h
            lea   si,Buffer+2
            mov   cl,Buffer+1
            mov   ch,0
            call  Sort
            
            mov   ah,8
            int   21h
            mov   ah,4ch
            int   21h

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    exit            ; все слова распечатаны
            mov   bx,Number     
            mov   byte ptr Flags[bx],1 ; пометить что распечатано
            mov   cx,dx
            mov   si,AdrWord
            ; вывод слова
            mov   ah,2
OutChar:
            lodsb
            mov   dl,al
            int   21h
            loop  OutChar
            mov   dl,' '
            int   21h
            jmp   NewFind         ; поиск минимального с начала строки
exit:
            pop   si
            pop   cx
            pop   di
            pop   dx
            pop   bx
            pop   ax
            ret
Sort        endp

            end   Start
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 21.05.2012, 17:02   #7
iLOL
Пользователь
 
Регистрация: 20.05.2012
Сообщений: 12
По умолчанию

Во спасибо, только вот это что значит строка?
Flags db ($-Buffer)/2 dup( 0 )
iLOL вне форума Ответить с цитированием
Старый 21.05.2012, 17:08   #8
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

максимальное количество слов ...
$-Buffer = текущий адрес($) - адрес начала Buffer= длина Buffer в байтах
/2 - количество слов, т.к. минимальная длина слова 1 символ и следом один пробел
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка слов. Строки Ester Помощь студентам 4 09.01.2012 19:30
Сортировка слов klin41 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 02.06.2010 04:38
задание о составлении слов из букв другого на tasm Ortega Помощь студентам 0 30.05.2010 22:07
Системная дата и время, их изменение через TAsm Mixim Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 11.11.2009 08:11
Проблема с передачей кириллицы через буфер обмена Windows Vodnik Win Api 2 12.07.2009 19:12