Помощь - Поиск - Пользователи - Календарь
Полная версия: Подсчет букв и цифр в массиве.
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ассемблер
Venom
Помогите написать программу. В институте задали, а про ассемблер ничего не рассказывают. Препод, которая задала прогу, сама его толком не знает, она только задания раздает, а препод который должен объяснять вообще на пары не ходит. Вот так вот мы и учимся, а сдавать все равно нужно...

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

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