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

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

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

> Подсчет букв и цифр в массиве.
Venom
сообщение 8.11.2008 15:51
Сообщение #1


Новичок
*

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

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


Помогите написать программу. В институте задали, а про ассемблер ничего не рассказывают. Препод, которая задала прогу, сама его толком не знает, она только задания раздает, а препод который должен объяснять вообще на пары не ходит. Вот так вот мы и учимся, а сдавать все равно нужно...

Вот задание: Дан массив состоящий из букв и цифр. Подсчитать в нем колличество букв и цифр. При написании программы использовать модель памяти Small.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 4)
volvo
сообщение 8.11.2008 18:54
Сообщение #2


Гость






Что ж вас, совсем ничему не учат? Вот основа программы, здесь не хватает только одной - единственной процедуры WriteDEC, которая получает через регистр AL байт, и печатает его десятичное представление (я ж не могу тебе программу предоставлять полностью, без усилий с твоей стороны, правда? Хотя бы процедуру напиши).

	.model small
	.data
		
sLetters	db 10, 13, 'Letters: ', '$'
sDigits	db 10, 13, 'Digits: ', '$'

Arr 		db 'h3llo 12345 w0rld ', '$'
ArrLen = $ - Arr

bLetters 	db 0
bDigits 	db 0

	.code

WriteDEC proc
; AL - байт для отображения 
...
WriteDEC endp

start:
        mov ax,@data
        mov ds,ax
	mov es, ax
	
	mov cx, ArrLen
	mov di, offset Arr
L1:
	mov al, [di]
        cmp AL, '0'
        jb L2
        cmp AL, '9'
        ja CheckLetter
	inc bDigits
	jmp L2
	
	CheckLetter:
	cmp al, 'a'
	jb L2
	cmp al, 'z'
	ja L2
	inc bLetters
	
	L2:
	inc di	
	loop L1
	
	mov dx, offset sLetters
	mov ah, 9h
	int 21h
	mov al, bLetters
	call WriteDEC
	
	mov dx, offset sDigits
	mov ah, 9h
	int 21h
	mov al, bDigits
	call WriteDEC

        mov ah, 4ch
        int 21h
end start
Если что непонятно - спрашивай...
 К началу страницы 
+ Ответить 
Venom
сообщение 8.11.2008 21:43
Сообщение #3


Новичок
*

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

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


volvo, большое спсибо! Представь себе нас совсем ни чему не учат. Я живу в маленьком городе и учусь в филиале института, где нет практически ни одного нормального преподавателя, который хоть что-то бы нормально объяснял. Сравниват мне есть с чем, т.к. по началу я учился в Москве и знаю как должны обучать... Сорри за оффтоп...
Сейчас буду разбираться и писать процедуру. Как мне кажется, в этой процедуре нужно использовать команду LODS?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Venom
сообщение 23.12.2008 17:13
Сообщение #4


Новичок
*

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

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


Помогите еще немного с этой задачей.
Я программу написал, но преподаватель сказал, что этот код можно оптимизировать, а как это сделать я незнаю. Оптимизированный код нужно уже завтра сдавать, помогите кто может mega_chok.gif


.model small
.286
.Stack	100h
.data
	CR	EQU 0Dh
	LF	EQU 0Ah 

sLetters	DB LF, CR, 'Количество букв: ', LF, CR, '$'
sDigits		DB LF, CR, 'Количество цифр: ', LF, CR, '$'

Msg1		DB 'Исходное предложение: ', LF, CR, '$'
Arr 		DB 'h3llo 12345 w0rld hkjdfhgjkdfghjkdfghdfjkghdfj', '$'
ArrLen = $ - Arr

bLetters 	db 0
bDigits 	db 0

Result		DB	'000', '$'

.code
start:
        mov	AX, @data
        mov 	DS, AX
	mov 	CX, ArrLen
	mov di, offset Arr
L1:
	mov al, [di]
        cmp AL, '0'
        jb L2
        cmp AL, '9'
        ja CheckLetter
	inc bDigits
	jmp L2
	
	CheckLetter:
	cmp al, 'a'
	jb L2
	cmp al, 'z'
	ja L2
	inc bLetters
	
L2:
	inc di	
	loop L1
	
	mov	DX, offset Msg1
	mov	AX, 0900h
	int	21h
	
	mov	DX, offset Arr
	int 	21h

	mov	DX, offset sLetters
	int 	21h
	
	mov	AL, bLetters
	mov	DX, offset Result
	call	ToDecimal
	mov	AX, 0900h
	int	21h

	mov	DX, offset sDigits
	int 	21h
	
	mov	AL, bDigits
	mov	DX, offset Result
	call	ToDecimal
	mov	AX, 0900h
	int	21h

	
        mov AX, 4C00h
        int 21h

ToDecimal	proc

	push	DX
	push	DI	
	mov	DI, DX
	mov	AH, 0
	mov	BL, 10
	push	-1
	
ToDecimalLoop01:	
	cmp	AL, 0
	je	ToDecimal01
	mov	AH, 0
	div	BL
	add	AH, '0'
	mov	DX, 0
	mov	DL, AH
	push	DX
	jmp	ToDecimalLoop01
ToDecimal01:
	pop	AX
	cmp	AL, -1
	je	ToDecimalQuit
	mov	[DI], AL
	inc	DI
	jmp	ToDecimal01
ToDecimalQuit:
	mov	DS:[DI], byte ptr '$'
	
	pop	DI
	pop	DX	
	ret
ToDecimal	endp
end start
end

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


Гость






Цитата
преподаватель сказал, что этот код можно оптимизировать
То вам ничего не объясняют, теперь "код можно оптимизировать"... Что тут оптимизировать? Основная часть - 4 сравнения, 5 Jump-ов и 2 операции Inc... Даже если создать строки букв и цифр, и сделать поиск символа в строке через SCASB - выйдет больше, потому как надо будет еще сохранять/восстанавливать CX, чтобы не портился в основном цикле.

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

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

 

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