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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.02.2016, 13:19   #11
Zaresh
Пользователь
 
Регистрация: 24.02.2016
Сообщений: 22
По умолчанию

Вот так сделал. После запуска в строке Result выводится только пустая строка. Что неправильно?
Код:
org  100h
jmp  start

hello   db  13,10,'String: $'
bye     db  13,10,'Result: $'
string  db  80,0,80 dup(' ')     ;' входной буфер для dos(0Ah)
buff    db  20 dup('$')          ;' выходной буфер (место под каждое слово)
                                 ;' макс.длина слова: 20 символов
start:
;' Сохраняем строку юзера ========================================
   mov   ah,9               ;
   mov   dx,hello           ;
   int   21h                ;
   mov   ah,0Ah             ;
   mov   dx,string          ;
   int   21h                ;
   mov   ah,9               ;
   mov   dx,bye             ;
   int   21h                ;

;' Копируем очередное слово из строки в буфер ====================
xor bp,bp ;ВОТ ЗДЕСЬ ОБНУЛЯЮ РЕГИСТР ВР
   xor   ch,ch              ;' СН = текущая позиция в строке
   mov   cl,[string+1]      ;' CL = длина введённой строки
   mov   si,string+2        ;' указатель на начало строки
startCopy:                  ;
   mov   di,buff            ;' адрес приёмного буфера
   xor   bx,bx              ;' ВХ = 0 (это будет длина слова)
copy:                       ;
   lodsb                    ;' берём символы из SI,
   cmp   al,' '             ;'    ..пока не встретиться пробел
   je    stopCopy           ;
   stosb                    ;' запись их в DI.
   inc   bx                 ;' длина слова +1
   inc   ch                 ;' позиция в строке +1
   jmp   copy               ;' сл.символ...

;' Встретился пробел. Поиск триады в слове =======================
stopCopy:                   ;' в ВХ лежит длина слова
   push  si cx              ;' запомним текущую позицию в строке
   mov   si,buff            ;' SI = плавающий символ в слове
   mov   dx,bx              ;' СX/DX = длина слова
find3:                      ;
   mov   cx,bx              ;
   inc   cx                 ;' захватим последний символ
   xor   ah,ah              ;' AH будет флагом совпадений
   mov   di,buff            ;' где искать
   mov   al,byte[si]        ;' что искать
@@:                         ;' <----------------<<---------------+
   repne scasb              ;' ищем до совпадения!               |
   or    cl,cl              ;' все символы слова проверили?      |
   jz    test3              ;' да:  тест на 3                    |
   inc   ah                 ;' нет: флаг +1                      |
   jmp   @b                 ;' продолжаем поиск совпадений -->---+
test3:                      ;
   cmp   ah,3               ;' проверка флага на 3
   inc bp                      ; ЗДЕСЬ ЕГО УВЕЛИЧИВАЮ НА ЕДИНИЦУ, ЕСЛИ АН=3
   jz    stopFind           ;' прыг если равно
   inc   si                 ;' иначе: ищем сл.символ слова
   dec   dx                 ;' уменьшить длину слова
   jnz   find3              ;' конец слова? нет: искать дальше..
   jmp   clearBuff          ;' иначе: нет триады. Очистить буфер!

;' Есть 3 совпадения! Выводим результат ===========================
stopFind:
   mov   ah,9               ;' выводим слово из буфера
   mov   dx,buff            ;
   int   21h                ;
   mov   al,' '             ;' ..и вставляем пробел/разделитель
   int   29h                ;
clearBuff:                  ;' забиваем буфер баксами
   mov   al,'$'             ;
   mov   cx,20              ;
   mov   di,buff            ;
   rep   stosb              ;

;' Читаем следующее слово... ======================================
nextWord:                   ;
   pop   cx si              ;' восстанавливаем позицию в строке юзера
   cmp   ch,cl              ;' всю строку проверили?
   ja    exit               ;' да - на выход!
   jmp   startCopy          ;' иначе: берём сл.слово строки в буфер

kolvo:         ; В ЭТОЙ ПРОЦЕДУРЕ ВЫВОЖУ РЕЗУЛЬТАТ И ЗАТЕМ ПЕРЕХОЖУ НА EXIT
        mov ah,9
        mov dx,bp
        int 21h
        jmp exit
exit:                       ;

   xor   ax,ax              ;
   int   16h                ;
   int   20h                ;' выход в DOS...
Zaresh вне форума Ответить с цитированием
Старый 29.02.2016, 13:31   #12
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

..а значение из BP кто будет переводить в символы?

Код:
kolvo:
mov  ax,bp
add   al,30h
int  29h
jmp exit
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 29.02.2016, 14:45   #13
Zaresh
Пользователь
 
Регистрация: 24.02.2016
Сообщений: 22
По умолчанию

Вроде работает

Последний раз редактировалось Zaresh; 29.02.2016 в 21:16.
Zaresh вне форума Ответить с цитированием
Старый 29.02.2016, 17:05   #14
Zaresh
Пользователь
 
Регистрация: 24.02.2016
Сообщений: 22
По умолчанию

Уважаемый R71MT, посмотрите, пожалуйста, код. Что скажете? Вроде сделал. Но разъясните, пожалуйста, почему если убрать текст, то bp показывает на один больше (комментарий этого "глюка" в коде)
Код:
org  100h
jmp  start

hello	db  13,10,'String: $'
bye	db  13,10,'Result: $'
string	db  80,0,80 dup(' ')	 ;' входной буфер для dos(0Ah)
buff	db  20 dup('$') 	 ;' выходной буфер (место под каждое слово)
				 ;' макс.длина слова: 20 символов
textKolvo db 13,10,'kolichestvo: $' 

start:
;' Сохраняем строку юзера ========================================
   mov	 ah,9		    ;
   mov	 dx,hello	    ;
   int	 21h		    ;
   mov	 ah,0Ah 	    ;
   mov	 dx,string	    ;
   int	 21h		    ;
   mov	 ah,9		    ;
   mov	 dx,bye 	    ;
   int	 21h		    ;

;' Копируем очередное слово из строки в буфер ====================
xor bp,bp
   xor	 ch,ch		    ;' СН = текущая позиция в строке
   mov	 cl,[string+1]	    ;' CL = длина введённой строки
   mov	 si,string+2	    ;' указатель на начало строки
startCopy:		    ;
   mov	 di,buff	    ;' адрес приёмного буфера
   xor	 bx,bx		    ;' ВХ = 0 (это будет длина слова)
copy:			    ;
   lodsb		    ;' берём символы из SI,
   cmp	 al,' ' 	    ;'	  ..пока не встретиться пробел
   je	 stopCopy	    ;
   stosb		    ;' запись их в DI.
   inc	 bx		    ;' длина слова +1
   inc	 ch		    ;' позиция в строке +1
   jmp	 copy		    ;' сл.символ...

;' Встретился пробел. Поиск триады в слове =======================
stopCopy:		    ;' в ВХ лежит длина слова
   push  si cx		    ;' запомним текущую позицию в строке
   mov	 si,buff	    ;' SI = плавающий символ в слове
   mov	 dx,bx		    ;' СX/DX = длина слова
find3:			    ;
   mov	 cx,bx		    ;
   inc	 cx		    ;' захватим последний символ
   xor	 ah,ah		    ;' AH будет флагом совпадений
   mov	 di,buff	    ;' где искать
   mov	 al,byte[si]	    ;' что искать
@@:			    ;' <----------------<<---------------+
   repne scasb		    ;' ищем до совпадения!		 |
   or	 cl,cl		    ;' все символы слова проверили?	 |
   jz	 test3		    ;' да:  тест на 3			 |
   inc	 ah		    ;' нет: флаг +1			 |
   jmp	 @b		    ;' продолжаем поиск совпадений -->---+
test3:			    ;
   cmp	 ah,3		    ;' проверка флага на 3
   jz	kolvoUvel ;stopFind	    ;' прыг если равно
   inc	 si		    ;' иначе: ищем сл.символ слова
   dec	 dx		    ;' уменьшить длину слова
   jnz	 find3		    ;' конец слова? нет: искать дальше..
   jmp	 clearBuff	    ;' иначе: нет триады. Очистить буфер!

;' Есть 3 совпадения! Выводим результат ===========================
	kolvoUvel:
	inc bp
	jmp stopFind

stopFind:
   mov	 ah,9		    ;' выводим слово из буфера
   mov	 dx,buff	    ;
   int	 21h		    ;
   mov	 al,' ' 	    ;' ..и вставляем пробел/разделитель
   int	 29h		    ;
clearBuff:		    ;' забиваем буфер баксами
   mov	 al,'$' 	    ;
   mov	 cx,20		    ;
   mov	 di,buff	    ;
   rep	 stosb		    ;

;' Читаем следующее слово... ======================================
nextWord:		    ;
   pop	 cx si		    ;' восстанавливаем позицию в строке юзера
   cmp	 ch,cl		    ;' всю строку проверили?
   ja	 kolvo		     ;' да - на выход!
   jmp	 startCopy	    ;' иначе: берём сл.слово строки в буфер

kolvo: ; САМЫЙ ПРИКОЛ ТВОРИТСЯ ЗДЕСЬ. ЕСЛИ УБРАТЬ ПЕРВЫЕ ТРИ СТРОКИ (ВЫВОД ТЕКСТА TEXTKOLVO)
		; ТО КОЛИЧЕСТВО ЧИСЕЛ БУДЕТ ВЫВОДИТСЯ НА ОДНО БОЛЬШЕ
		; ТАКОЕ ОЩУЩЕНИЕ, ЧТО РЕГИСТР ВР ЧТО ПОДХВАТЫВАЕТ ИЗ AL ТИПО ПРОБЕЛА
		; А ЕСЛИ ТЕКСТ СНАЧАЛА ВЫВЕСТИ, ТО ВСЕ НОРМ
	mov   ah,9               ;
    mov   dx,textKolvo            ;
    int   21h   
	mov  ax,bp
	add   al,30h
	int  29h
	jmp exit
	
exit:			    ;

   xor	 ax,ax		    ;
   int	 16h		    ;
   int	 20h		    ;' выход в DOS...

Последний раз редактировалось Zaresh; 29.02.2016 в 21:16.
Zaresh вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal ABC. Даны три массивы. Определить общее количество элементов массивов, значение которых лежат в интервале (подпрограмма) MarsLoveMoon Паскаль, Turbo Pascal, PascalABC.NET 6 24.04.2014 19:28
Сколько n-значных чисел можно образовать из двух цифр 5 и 9, в которых три одинаковые цифры не стоят рядом Thunder Dragon Паскаль, Turbo Pascal, PascalABC.NET 7 26.03.2012 20:05
определить количество четных чисел и количество нечетных чисел массива, которые вводятся в МЕМО, вывести в поле компонента Edit. Pyxy Помощь студентам 2 21.03.2012 23:24
Pascal.Определить к-количество трехзначных натуральных чисел,сумма цифр которых n (n=13). naty7773 Помощь студентам 2 11.01.2012 16:43
Задана последовательность чисел в формате:сначала количество цифр в числе, потом - цифры числа. Подсчитать количество. Arn1 Помощь студентам 4 03.10.2011 20:03