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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2010, 23:40   #1
LavcCraft
 
Регистрация: 13.12.2010
Сообщений: 4
По умолчанию Гистограмма количества латинских букв

Задание: построить гистограмму присутсвия латинских букв во вводимом слове
Гистограмму нарисовал, она даже правильно строится, но когда вводятся символы больше чем p начинает заполняться с начала.
Т.е жму 'a' прибавляется в столбике "а"
Жму 'q' тоже прибавляется в столбике 'a'
жму 'r' прибавляется в столбике 'b'
жму 'b' прибавляется в столбике 'b'
Непонимаю в чём ошибка… Может кто укажет и скажет как исправить?
Заранее спасибо
Моя реализация:
Код:
;======================================================================
.model small ;определили модель памяти как small
.stack 256 ;выделели под программу 128 байт памяти
.data ;объявили сегмент данных
; данные
azbuka		db	'a b c d e f g h i j k l m n o p q r s t u v w x y z $'
tmp			db	28 dup (?),'$'
.code
; код программы
main:
		mov ax,@data
		mov ds,ax
		
		call	clrs		;очистка экрана
		mov		dx,0003h
		call	setcur		;установка курсора
		mov		dx,1803h
		call	setcur		;установка курсора
		lea		dx,azbuka
		call	outstr
		mov		dx,1703h
		call	setcur
		jmp		for
for:	mov		dx,0000h
		call	setcur		;установка курсора
		call	insc 
		cmp		al,13		;если ентер заканчиваем ввод
		jne		cont
		jmp		ender
cont:   cmp		al,64		;если не буква латинского алфавита заканчиваем ввод
		jbe		for       
		cmp		al,90
		jle		for
		sub		al,17
		and		al,0fh
		xor		bh,bh
		mov		bl,al
		inc		tmp[bx] 
		mov		ah,tmp[bx]
		mov		dh,24
		sub		dh,ah		;строка
		mov		dl,2
		mul		dl
		add		al,3
		mov		dl,al		;столбец
		call	setcur
		call	outpr
		jmp		for


; чистим экран через BIOS
clrs	proc	near
		mov		ax,0600h
		mov		bh,07h
		mov		cx,0000
		mov		dx,184fh
		int		10h
		ret
clrs	endp
;стави курсор
setcur	proc	near
		mov		ah,02
		mov		bh,00
		int		10h
		ret
setcur	endp
; вывод текста через DOS  ( dx-адрес текста с '$' в конце )
outstr  proc	near
		mov		ah,09
		int		21h
		ret
outstr	 endp
;вывод без эха
insc	proc	near
		mov		ah,00
		int		16h
		ret
insc	 endp
outpr   proc	near
		mov		ah,09h
		mov		al,' '
		mov		bh,00h
		mov		bl,50h
		mov		cx,1
		int		10h
		ret
outpr   endp 

ender:	mov		ax,4c00h
		int		21h
end main
LavcCraft вне форума Ответить с цитированием
Старый 14.12.2010, 11:40   #2
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

LavcCraft
чуток подправил
Код:
.286
.model small ;определили модель памяти как small
.stack 256 ;выделели под программу 128 байт памяти
.data ;объявили сегмент данных
; данные
azbuka db 'a b c d e f g h i j k l m n o p q r s t u v w x y z $'
tmp db 28 dup (?),'$'
.code
; код программы
main:	mov ax,@data
	mov ds,ax

	mov ax,600h
	mov bh,7
	xor cx,cx
	mov dx,184Fh
	int 10h; чистим экран через BIOS
		
	mov dx,3
	call setcur		;установка курсора
	mov dx,1803h
	call setcur		;установка курсора
	mov dx,offset azbuka
	mov ah,9
	int 21h; вывод текста через DOS 	
	mov dx,1703h
	call setcur
for1:	xor dx,dx
	call setcur		;установка курсора
	mov ah,0
	int 16h;вывод без эха
	cmp al,0Dh		;если ентер заканчиваем ввод
	je ender
cont:   cmp al,'A'	;если не буква латинского алфавита заканчиваем ввод
	jb for1       
	cmp al,'Z'
	jbe for1
	sub al,33
	and ax,1Fh
	mov bx,ax
	inc tmp[bx] 
	mov dh,24
	sub dh,tmp[bx]	;строка
	shl al,1
	add al,3
	mov dl,al		;столбец
	call setcur
	mov ax,920h
	mov bx,50h
	mov cx,1
	int 10h
	jmp for1
ender: mov ah,4Ch
	int 21h
;стави курсор
setcur	proc	
	mov ah,2
	mov bh,0
	int 10h
	ret
setcur	endp
end main

Последний раз редактировалось Mikl___; 15.12.2010 в 09:45.
Mikl___ вне форума Ответить с цитированием
Старый 16.12.2010, 18:05   #3
LavcCraft
 
Регистрация: 13.12.2010
Сообщений: 4
По умолчанию

А можете пояснить?
LavcCraft вне форума Ответить с цитированием
Старый 17.12.2010, 04:52   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

Цитата:
Сообщение от LavcCraft
А можете пояснить?
Что пояснить? Такая классная программулька, я думал, что ты ее сам написал:
1) там заменен сдвиг арифметический SAR на логический SHR
2) sub al,17 / and al,0fh на sub al,33 /and ax,1Fh
3) убраны подпрограммы, которые вызываются всего один раз (insc, outstr, outpr)
4) немного сокращен код это ты увидишь если будешь сравнивать мой и свой исходный текст
Mikl___ вне форума Ответить с цитированием
Старый 17.12.2010, 20:23   #5
LavcCraft
 
Регистрация: 13.12.2010
Сообщений: 4
По умолчанию

Написал там сам, там где умножение я понял, я просто правую часть байта обнулял зачем то.. пережиток прошлого. А вот почему вы 33 вычитаете?
LavcCraft вне форума Ответить с цитированием
Старый 17.12.2010, 20:27   #6
LavcCraft
 
Регистрация: 13.12.2010
Сообщений: 4
По умолчанию

Вот кстати завершённый вариант. Сделал чтобы буквы были и маленькие и большие. Так вроде логичней судя по заданию
Код:
;======================================================================
.model small ;определили модель памяти как small
.stack 256 ;выделели под программу 128 байт памяти
.data ;объявили сегмент данных
; данные
azbuka		db	'a b c d e f g h i j k l m n o p q r s t u v w x y z $'
tmp			db	128 dup (?),'$'
prigl		db	'enter - exit program$'
.code
; код программы
main:
		mov ax,@data
		mov ds,ax
		
		call	clrs			;очистка экрана
		mov		dx,0001h
		call	setPosition		;установка курсора
		mov		dx,offset prigl
		call	printstr
		mov		dx,1803h
		call	setPosition		;установка курсора
		lea		dx,azbuka
		call	printstr
		mov		dx,1703h
		call	setPosition
		jmp		for
for:	mov		dx,0000h
		xor		al,al
		call	setPosition		;установка курсора
		call	insc 
		cmp		al,13			;если ентер заканчиваем ввод
		jne		cont
		jmp		ender
cont:   cmp		al,65			;если не буква латинского алфавита заканчиваем ввод
		jl		for       
		cmp		al,90
		jg		upC1
		sub		al,65
		jmp		upC3
		
upC1:	jl		for
		cmp		al,122
		jg		for
		sub		al,97
upC3:	xor		bh,bh
		mov		bl,al
		inc		tmp[bx] 
		mov		ah,tmp[bx]
		mov		dh,24
		sub		dh,ah			;строка
		mov		dl,2
		mul		dl
		add		al,3
		mov		dl,al			;столбец
		call	setPosition
		call	printBlock
		jmp		near ptr for


; чистим экран через BIOS
clrs	proc	near
		mov		ax,0600h
		mov		bh,07h
		mov		cx,0000
		mov		dx,184fh
		int		10h
		ret
clrs	endp
;стави курсор
setPosition	proc	near
		mov		ah,02
		mov		bh,00
		int		10h
		ret
setPosition	endp
; вывод текста через DOS  ( dx-адрес текста с '$' в конце )
printstr  proc	near
		mov		ah,09
		int		21h
		ret
printstr	 endp
;вывод без эха
insc	proc	near
		mov		ah,00
		int		16h
		ret
insc	 endp
printBlock   proc	near
		mov		ah,09h
		mov		al,' '
		mov		bh,00h
		mov		bl,50h
		mov		cx,1
		int		10h
		ret
printBlock   endp 

ender:	mov		ax,4c00h
		int		21h
end main
LavcCraft вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
преобразование латинских заглавных букв в строчные на assembler lastochka Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 19.05.2013 11:58
Выбор латинских букв из массива. Tonik_A Помощь студентам 1 03.01.2010 17:51
поиск латинских гласных букв в строке KoFeMaN Помощь студентам 7 12.12.2009 17:24