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

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

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

 
 Ответить  Открыть новую тему 
> Подсчет букв и цифр в массиве.
сообщение
Сообщение #1


Новичок
*

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

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


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

Вот задание: Дан массив состоящий из букв и цифр. Подсчитать в нем колличество букв и цифр. При написании программы использовать модель памяти Small.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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
Если что непонятно - спрашивай...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

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

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


volvo, большое спсибо! Представь себе нас совсем ни чему не учат. Я живу в маленьком городе и учусь в филиале института, где нет практически ни одного нормального преподавателя, который хоть что-то бы нормально объяснял. Сравниват мне есть с чем, т.к. по началу я учился в Москве и знаю как должны обучать... Сорри за оффтоп...
Сейчас буду разбираться и писать процедуру. Как мне кажется, в этой процедуре нужно использовать команду LODS?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






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

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

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

 





- Текстовая версия 13.11.2019 19:15
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name