IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Обработка символьной информации, с помощью функций DOS
Rocket
сообщение 5.10.2008 0:11
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Вот задание: Ввести с клавиатуры две строки. Сравнить их. Вывести на экран какая из строк больше и насколько. Какие мысли есть по реализации данной программы? Как осуществить сравнение строк?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 6.10.2008 19:22
Сообщение #2


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


Что значит "строка больше"? По длине?


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Rocket
сообщение 6.10.2008 20:28
Сообщение #3


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(мисс_граффити @ 6.10.2008 20:22) *

Что значит "строка больше"? По длине?

Та по длине походу... сравнивать количество символов...как реализовать- до сих пор загадка..smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 6.10.2008 23:02
Сообщение #4


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Rocket @ 6.10.2008 20:28) *
Та по длине походу... сравнивать количество символов...как реализовать- до сих пор загадка..smile.gif
При чем тут загадка? Не понимаю. Если по длине, то функция Length(s) решает все проблемы.
Но если требуется все-таки лексикографическое сравнение, то тогда действительно загадка. То есть само сравнение будет еще проще (типа s1<s2), но совершенно непонятно, что значит "на сколько" [орфография моя].


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Rocket
сообщение 6.10.2008 23:23
Сообщение #5


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(Lapp @ 7.10.2008 0:02) *

При чем тут загадка? Не понимаю. Если по длине, то функция Length(s) решает все проблемы.
Но если требуется все-таки лексикографическое сравнение, то тогда действительно загадка. То есть само сравнение будет еще проще (типа s1<s2), но совершенно непонятно, что значит "на сколько" [орфография моя].

В ассемблере есть функция length(s)?...в мои познания этого языка данная функция ещё не входит...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 6.10.2008 23:29
Сообщение #6


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Rocket @ 6.10.2008 23:23) *
В ассемблере есть функция length(s)?...в мои познания этого языка данная функция ещё не входит...
Упс! погорячился... smile.gif)) Прошу прощения!

А как организаешь строки? Паскалевсие или нуль-терминированные?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 7.10.2008 14:37
Сообщение #7


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


Ввод строк сделал? Проблемы только с определением длины?
Могу попробовать вечером набросать код... но неохота тупо выкладывать готовую работу.

Lapp, что значит "паскалевские строки" применительно к асму?


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Rocket
сообщение 7.10.2008 17:09
Сообщение #8


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(мисс_граффити @ 7.10.2008 15:37) *

Ввод строк сделал? Проблемы только с определением длины?
Могу попробовать вечером набросать код... но неохота тупо выкладывать готовую работу.

Lapp, что значит "паскалевские строки" применительно к асму?

Не большой пример про ввод строки я видел, выглядит примерно вот так:

buffer 		db 11 		; Нулевой байт буфера
entered 	db (?) 		; Число введенных символов
string 		db 11 dup (?) 	; Введенные символы 


Сам ввод выполняется командами:

 lea dx, buffer 		; Адрес буфера  в dx
mov ah, 0ah 		; Номер функции в аh
 int 21h 			; Вызов функции


Что изменится при вводе двух строк?
А набросанный код пришёлся бы очень кстати) всё равно и в нём нужно будет разобраться


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 7.10.2008 20:26
Сообщение #9


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


Ну например...
.model small
.stack 512
.data
buf1 db 10 dup(?)
buf2 db 10 dup(?)
len1 dW (?)
mes1 db 'First is longer$'
mes2 db 'Second is longer$'
.code
	;заносим адрес сегмента данных в DX
	mov AX, @data
	mov DS, AX
	
	lea dx,buf1	;куда считываем первую строку символов
	mov ah,3Fh	;ввод с клавиатуры целой строки
	mov bx,0
	int 21h
	mov len1,ax 	;кол-во реально введенных символов+2 (0Ah и ODh - то есть Enter)

	lea dx,buf2	;куда считываем вторую строку символов
	mov ah,3Fh	;ввод с клавиатуры целой строки
	mov bx,0
	int 21h
	
	cmp ax,len1
	jge m2
	
	mov ah,9	;выводим  сообщение 
	lea dx,mes1
	int 21h		
	jmp finish	;всё...
	
m2:	mov ah,9	;выводим  сообщение 
	lea dx,mes2
	int 21h		
	
finish: mov ax,4c00h
	int 21h
	end 

Длина строк маленькая (см. объявление переменных).
НА СКОЛЬКО они отличаются - не считаю (думаю, с арифм операциями как-нибудь разберешься).
Вариант равенства длин не предусмотрен.
Ну и косяки могут быть - ассемблер я не знаю практически.


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Rocket
сообщение 8.10.2008 23:38
Сообщение #10


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(мисс_граффити @ 7.10.2008 21:26) *
Ну например...

всё отлично, большое спасибо) вот только вывод сообщения отказывается работать...
Я вот так немного переделал:

data segment
buf1 db 10 dup(?)
buf2 db 10 dup(?)
len1 dW (?)
mes1 db 'First is longer$'
mes2 db 'Second is longer$'
data ends
code segment
assume cs:code, ds:data

start:	mov AX, data
	mov DS, AX
	
	lea dx,buf1	;куда считываем первую строку символов
	mov ah,3Fh	;ввод с клавиатуры целой строки
	mov bx,0
	int 21h
	mov len1,ax 	;кол-во реально введенных символов+2 (0Ah и ODh - то есть Enter)

	lea dx,buf2	;куда считываем вторую строку символов
	mov ah,3Fh	;ввод с клавиатуры целой строки
	mov bx,0
	int 21h
	
	cmp ax,len1
	jge m2
	
	lea dx,mes1
	mov ah,09h	;выводим  сообщение
	int 21h		
	jmp finish	;всё...
	
m2:     lea dx,mes2
	mov ah,09h	;выводим  сообщение
	int 21h		
	
finish: mov ax,4c00h
	int 21h
code ends
end start



Сообщение отредактировано: volvo - 14.01.2009 0:26
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 8.10.2008 23:54
Сообщение #11


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


У меня работает все.
Да ты по сути ничего в этой сфере вроде и не изменил. Строки местами поменял - и все?

Если assume написал - убери
mov AX, data
	mov DS, AX

оно у тебя уже делается.




--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Rocket
сообщение 9.10.2008 23:21
Сообщение #12


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(мисс_граффити @ 9.10.2008 0:54) *

У меня работает все.
Да ты по сути ничего в этой сфере вроде и не изменил. Строки местами поменял - и все?

Если assume написал - убери
mov AX, data
	mov DS, AX

оно у тебя уже делается.

Без assume вообще не работает... Впрочем сообщение также отказывается выводить unsure.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 9.10.2008 23:43
Сообщение #13


Гость






Rocket,
Чем компилируешь, если не секрет?

Приведенный тобой в 10-м сообщении код прекрасно отрабатывает после сборки ДОСовским TASM-ом версии 3.0... Отладчиком не смотрел, на каком этапе у тебя проблема?
 К началу страницы 
+ Ответить 
Rocket
сообщение 10.10.2008 21:31
Сообщение #14


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 10.10.2008 0:43) *

Rocket,
Чем компилируешь, если не секрет?

Приведенный тобой в 10-м сообщении код прекрасно отрабатывает после сборки ДОСовским TASM-ом версии 3.0... Отладчиком не смотрел, на каком этапе у тебя проблема?

Проблема в том, что не выводит сообщение в Turbo Debugger'е (версия 3.1). Tasm у меня версии 1.0...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 10.10.2008 21:51
Сообщение #15


Гость






Цитата
Проблема в том, что не выводит сообщение в Turbo Debugger'е (версия 3.1)
А может, ты его просто не видишь? wink.gif Alt+F5 не пробовал для просмотра результатов? Ну, или View -> User Screen...
 К началу страницы 
+ Ответить 
Rocket
сообщение 10.10.2008 22:01
Сообщение #16


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 10.10.2008 22:51) *

А может, ты его просто не видишь? wink.gif Alt+F5 не пробовал для просмотра результатов? Ну, или View -> User Screen...

smile.gif так и оказалось... Теперь я буду знать столь "хитрую" комбинацию клавиш!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Rocket
сообщение 13.11.2008 1:20
Сообщение #17


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Всё-таки как организовать вывод сообщеия о том насколько отличаются строки?
Вот как я делаю:

data segment
buf1 db 10 dup(?)
buf2 db 10 dup(?)
len1 dW (?)
mes1 db 'First is longer!$'
mes2 db 'Second is longer!$'
X dw ?
data ends
code segment
assume cs:code, ds:data

start:	mov AX, data
	mov DS, AX
	
	lea dx,buf1	;куда считываем первую строку символов
	mov ah,3Fh	;ввод с клавиатуры целой строки
	;mov bx,0
	int 21h
	mov len1,ax 	;кол-во реально введенных символов+2 (0Ah и ODh - то есть Enter)

	lea dx,buf2	;куда считываем вторую строку символов
	mov ah,3Fh	;ввод с клавиатуры целой строки
	;mov bx,0
	int 21h
	
	cmp ax,len1
	jge m2
	
                sub ax,len1
                mov X,ax

	lea dx,X
	mov ah,02h	; вот здесь что-то неправильно...
	int 21h	
                                

	lea dx,mes1
	mov ah,09h	;выводим  сообщение
	int 21h	
   	
	jmp finish	;всё...
	
m2:          
                sub ax,len1
                mov X,ax

             lea dx,X
	mov ah,02h	;оно же
	int 21h	

                lea dx,mes2
	mov ah,09h	;выводим  сообщение
	int 21h		

	
finish: mov ax,4c00h
	int 21h
code ends
end start

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 13.11.2008 2:18
Сообщение #18


Гость






Ну, и кто тебе сказал, что
lea dx, X

преобразует тебе число в его символьное представление? Функция 02H прерывания 21H ведь выводит символ, код которого хранится в DX, а у тебя в DX что хранится?

Убери из сегмента данных X, и добавь вместо него len2...
	lea dx, buf1	;куда считываем первую строку символов
	mov ah, 3Fh	; ввод с клавиатуры целой строки
	int 21h
	mov len1, ax 	; кол-во реально введенных символов+2 (0Ah и ODh - то есть Enter)

	lea dx, buf2	; куда считываем вторую строку символов
	mov ah, 3Fh	; ввод с клавиатуры целой строки
	int 21h
	mov len2, ax
	
	cmp ax, len1
	jge m2
	
	mov ax, len1
	sub ax, len2
	add ax, 48		; переводим в CHAR
	mov dx, ax	; заносим в DX
	mov ah, 02h	; печатаем
	int 21h
                                
	lea dx, mes1
	mov ah, 09h	; выводим  сообщение
	int 21h	
   	
	jmp finish		; всё...
	
m2: 
	mov ax, len2
	sub ax, len1
	add ax, 48
	mov dx, ax
	mov ah, 02h
	int 21h
	
	lea dx,mes2
	mov ah,09h	; выводим  сообщение
	int 21h
	
finish:

 К началу страницы 
+ Ответить 
Rocket
сообщение 27.11.2008 22:31
Сообщение #19


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


А если у нас не 10 символом максимальный размер, а 100, то как тогда вывести разность длин строк? (то есть проблема с выводом двузначного числа,к примеру)
И функция 3Fh, что она делает?

Сообщение отредактировано: volvo - 14.01.2009 0:27
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 27.11.2008 23:12
Сообщение #20


Гость






Значит, придется написать процедуру вывода десятичного числа:


; В сегменте данных:
count_of_digits	dw 4 ; число будет отображаться в четырех позициях
; ...

writeDEC proc
	;  выводим содержимое AX
	push ax
	push bx
	push cx
	push dx
	
	push di		; здесь будем хранить признак знака
	xor cx, cx
	mov bx, 10
	xor di, di	; 0 = число положительное
	or ax, ax	; Проверим, не отрицательное ли число в AX
	jns next_digit	; Не отрицательное... Переходим дальше
	inc di		; Отрицательное. Выставляем DI в 1 (число отрицательное) ...
	neg ax		; ... и меняем знак числа
	
next_digit:
	xor dx, dx	; DX обнуляется. Чтобы можно было делить DWORD на WORD
	div bx		; Делмм DX:AX на BX (т.е. на 10) ...
	push dx		; ... остаток забрасываем в стек ...
	inc cx		; Увеличим счетчик цифр
	or ax, ax
	jnz next_digit	; ... и продолжаем этот цикл пока AX <> 0
	
	mov dx, count_of_digits
	sub dx, cx	; вычисляем, сколько пробелов надо вывести перед числом
	or di, di
	jz _zer
	dec dx		; если ранее был установлен "признак отрицательности"
			; то уменьшаем число пробелов еще на 1, поскульку надо еще вывести "-"
_zer: 
	push cx		; сохраним число цифр в стеке
	mov  cx, dx
	mov al, ' '	; и напечатаем необходимое число пробелов
next_space:
	int 29h		; прерывание 29h - вывод на консоль
	loop next_space
	
	pop  cx		; вернем число цифр
	or di, di
	jz next_char
	mov al, '-'
	int 29h		; если нужен минус - выводим его
	
next_char:
	pop ax		; остатки от деления возвращаем в AX
	add al, '0'	; преобразуем в символ (добавляя код '0')
	int 29h		; и выводим на консоль
	loop next_char
	
	pop  di		; восстанавливаем все регистры
	pop  dx
	pop  cx
	pop  bx
	pop  ax
	ret		; и выходим из процедуры
writeDEC endp

, и вызывать вот так:
	; ...
	mov ax, len1
	sub ax, len2
	call writeDEC	; печатаем разность
	
	lea dx, mes1
	mov ah, 09h	; выводим сообщение, что первая строка длиннее
	int 21h
   	
	jmp finish		; на выход

m2:
	mov ax, len2
	sub ax, len1
	call writeDEC	; печатаем разность
	
	lea dx, mes2
	mov ah,09h	; выводим сообщение, что длиннее вторая строка
	int 21h
	
finish:
	; ...


Цитата
И функция 3Fh, что она делает?
Ну ты даешь... smile.gif Я что-ли эту функцию придумал использовать? Ты сам в своей программе ее применял, а теперь спрашиваешь... Она вводит с клавиатуры строку (максимально возможную длину строки надо занести в CX), и помещает ее в буфер (адрес буфера - в DX).

Сообщение отредактировано: volvo - 28.11.2008 1:09
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 20.07.2025 2:32
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"