Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик Гаряка
Статус: Академик
Рейтинг: 10360
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Академик
Рейтинг: 3927
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2372
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1512
Дата выхода:18.04.2012, 17:30
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:99 / 40
Вопросов / ответов:1 / 1

Консультация # 185830: Здравствуйте, уважаемые эксперты! Прошу вас написать программу вот с таким заданием: Программа просит ввести строку. Подсчитать количество слов в строке (слова разделены пробелом). При обработке использовать только команды работы со строками. Обработку оформить в виде процедуры. Результат вывести на экран и записать в файл. Сделать на...


Консультация # 185830:

Здравствуйте, уважаемые эксперты! Прошу вас написать программу вот с таким заданием:

Программа просит ввести строку. Подсчитать количество слов в строке (слова разделены пробелом). При обработке использовать только команды работы со строками. Обработку оформить в виде процедуры. Результат вывести на экран и записать в файл.

Сделать надо как можно проще

п.с.
Ассемблер : TASM
Написать к каждой строчке комментарии

Заранее спасибо.

Дата отправки: 15.04.2012, 17:01
Вопрос задал: Yankov Dmitry (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, Yankov Dmitry!
Надеюсь, комментариев будет достаточно...
Если что, спрашивайте... smile

Код :
;Программа просит ввести строку. 
;Подсчитать количество слов в строке (слова разделены пробелом). 
;При обработке использовать только команды работы со строками. 
;Обработку оформить в виде процедуры. 
;Результат вывести на экран и записать в файл.

	.model	small
	.data
sEnter	db	'Enter string: ',0	;строка приглашения для ввода строки
sAny	db	13,10,'Press any key',0	;строка приглашения нажать в конце на клавишу
sName	db	'count.txt',0		;имя файла

;ошибки
sOpenError	db	13,10,'Open error',0
sWriteError	db	13,10,'Write error',0

sWords	db	13,10,'Words count = '	;сообщение о числе слов
sCount	db	8 dup (0)		;здесь будет число - количество слов
					;буфер для ввода строки для функции 0ah
buf	db	80			;максимальный размер
len	db	0			;здесь будет реальная длина введенной строки
string	db	80 dup (0)		;сама строка

	.code
start:
	mov	ax, @data
	mov	ds, ax
	mov	es, ax

	lea	si, sEnter
	call	PrintString	;выведем строку приглашения ввода

	lea	dx, buf
	mov	ah, 0ah
	int	21h		;вводим строку

	lea	si, string
	call	CalcWords	;считаем слова в AX

	lea	di, sCount
	call	IntToString	;преобразуем число AX в строку es:[di]

	lea	si, sWords
	call	PrintString	;выводим сообщение о числе слов

	lea	si, sWords+2	;+2, чтобы обойти 0d0a
	call	WriteToFile	;и в файл

	lea	si, sAny
	call	PrintString	;press any key

	mov	ah, 0
	int	16h		;ждем any key

	mov	ax, 4c00h
	int	21h

PrintString	proc		;вывод строки ds:[si], заканчивающейся нулем
	mov	ah, 2		;ф-я вывода символа из dl
PrintStringLoop:
	lodsb			;очередной
	cmp	al, 0		;0?
	je	PrintStringRet	;да - на выход
	mov	dl, al		;нет - выводим на экран
	int	21h
	jmp	PrintStringLoop
PrintStringRet:
	ret
PrintString	endp

CalcWords	proc		;считаем слова в строке ds:[si], заканчивающейся 0dh
	xor	dx, dx		;число слов
CalcWordsStartWord:
	xor	cx, cx		;признак наличия слова
CalcWordsLoop:
	lodsb			;очередной
	cmp	al, 0dh		;по 0dh 
	je	CalcWordsLast	;на проверку последнего слова
	cmp	al, ' '		;если не пробел
	jne	CalcWordsNotSpace ;то на очередной символ слова
	jcxz	CalcWordsLoop	;повторные пробелы игнорируем
	inc	dx		;считаем слова по первому пробелу после каждого слова!
	jmp	CalcWordsStartWord ;на сброс признака наличия слова
CalcWordsNotSpace:
	inc	cx		;не пробел - делаем признак слова ненулем!
	jmp	CalcWordsLoop
CalcWordsLast:			;проверим на последнее слово
	jcxz	CalcWordsRet	;=0, когда после пробела, т.е. слов нет
	inc	dx		;!=0, значит было слово, учтем его
CalcWordsRet:
	mov	ax, dx		;результат в ax
	ret
CalcWords	endp
	
IntToString	proc		;преобразование числа AX в строку es:[di]
	xor	cx, cx		;счетчик цифр
	mov	bx, 10		;будем делить на 10
IntToStringLoop:
	xor	dx, dx		;готовимся к делению
	div	bx		;dx:ax / bx
	push	dx		;остаток - очередную цифру сохраняем в стеке
	inc	cx		;считаем
	test	ax, ax		;циклим, пока частное не нуль
	jne	IntToStringLoop
ConvertLoop:			;выведем в обратном порядке
	pop	ax		;очередной разряд
	or	al, 30h		;0-9 -> '0'-'9'
	stosb			;сохраняем
	loop	ConvertLoop	;по всем цифрам
	xor	ax, ax		;закроем строку нулем
	stosb	
	ret
IntToString	endp

WriteToFile	proc		;вывод в файл строки ds:[si]
	lea	dx, sName	;имя файла
	xor	cx, cx		;атрибут (без атрибутов)
	mov	ah, 3ch		;ф-я создания файла
	int	21h		;создаем файл
	jc	CreateError	;если ошибка
	mov	bx, ax		;handle файла

	mov	di, si		;найдем длину строки
	mov	al, 0		;будем искать 0
	mov	cx, 32		;длина, большая строки
	repne	scasb		;ищем
	mov	word ptr [di-1], 0a0dh	;добавим конец строки
	lea	cx, [di+1]	;адрес за строкой
	sub	cx, si		;длина строки
	mov	dx, si		;адрес строки ds:[dx]
	mov	ah, 40h		;ф-я вывода в файл
	int	21h		;пишем
	jc	WriteError	;если ошибка
	mov	ah, 3eh		;закрываем файл
	int	21h
	ret
CreateError:
	lea	si, sOpenError
	call	PrintString
	ret
WriteError:
	mov	ah, 3eh		;закрываем файл
	int	21h
	lea	si, sWriteError
	call	PrintString
	ret
WriteToFile	endp

	end	start

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 16.04.2012, 02:32

5
нет комментария
-----
Дата оценки: 16.04.2012, 12:37

Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное