Консультация № 185671
26.03.2012, 10:38
113.51 руб.
0 3 1
Доброго времени суток уважаемые эксперты. Прошу решить следующую задачу по программированию.
Написать на языке ассемблера программу, реализующую некоторый алгоритм в соответствии с полученным заданием:

Дан текст. Определить, сколько в нем групп букв "abc", "bac".

По итогам выполнения работы оформляется отчет.
Отчет о выполнении работы должен содержать:
краткие теоретические сведения, необходимые для выполнения работы;
описание структур данных, обрабатываемых программой;
описание алгоритма выполнения задания в виде псевдокода или блок схемы;
описание вводимых данных и результатов работы программы;
требования, к техническим и программным средствам, необходимым для выполнения программы.
тексты программ на ассемблере, разрабатываемые при выполнении лабораторных работ, должны содержать достаточное количество комментариев.

Обсуждение

давно
Старший Модератор
31795
6196
26.03.2012, 10:44
общий
1)текст вводится с клавиатуры, с файла?
2)процессор?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
27.03.2012, 10:59
общий
Адресаты:
Судя по вопросу, полагаю, что имеем только начало изучения.
А посему, ввод с клавиатуры и под 86.
Сделаете или мне сделать?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
27.03.2012, 16:39
общий
это ответ
Здравствуйте, Посетитель - 392980!


Смотрите приложение:

По условию задания, необходимо проверять группы "abс" и "baс". Совпадает в проверяемых группах только последний символ. На основании этого, в введенной строке ищется символ "с" и проверяется на совпадение два предыдущих "ab" и "ba". Чтобы не усложнять понимание работы самого алгоритма даные вводятся с клавиатуры. Теоритически было бы более правильным иcпользовать строковые команды SCAS и CMPS, но так как в задании ничего не указано о строках и подстроках, использовался более простой алгоритм.

Основной структурой программы является строка используемая функцией 0Аh прерывания 21h:
dbMax db MaxString -максимальная длина вводимой строки(используется функцией);
dbLen db ? - реальная длина введенной строки(заполняется функцией);
dbData db MaxString dup(?) - буффер из MaxString байт для хранения введенной строки.

Блок-схема:

двойной стрелкой указаны переходы совпадающие с условием проверки;

См. рисунок, как пример работы:


Процессор intel x86 или совместимый;
Среда - DOS;
Модель организации памяти в программе - tiny;
Компилятор TASM.
Команды компилятора в командной строке:
Код:
tasm name
tlink name /t

обратите внимание на ключ /t во второй строке

замечания по программе:
-программа работает только со строчныим буквами;
-при вводе 97-ми символов начинающихся с "bс..." или 98-ми символов начинающихся с "ас..." - будет ложное срабатывание в соответсвующей группе.


Удачи!

Приложение:
model tiny
.code
MaxString equ 255
org 100h
;предлагаем ввести строку данных
begin: mov ah,09h
lea dx,dbEnter
int 21h
;вводим строку
mov ah,0ah
lea dx,dbMax
int 21h
;
;готовимся к циклу проверки
xor cx,cx
;сбрасываем счетчики
mov dwCount,cx
lea bx,dbLen
;считываем длину введенной строки
mov cl,[bx]
;цикл проверки
;следующий элемент
@@01: inc bx
;проверяем полседний символ последовательности
cmp byte ptr[bx],'c'
jnz @@03
;проверяем предыдущие символы последовательности 'baс'
cmp [bx-2],'ab'
jnz @@02
;увеличиваем счетчик
inc dbBA
;проверяем предыдущие символы последовательности 'abс'
@@02: cmp [bx-2],'ba'
jnz @@03
;увеличиваем счетчик
inc dbAB
;пока не просмотрим всю строку
@@03: loop @@01
;выводим результат по последовательности 'abс'
mov ah,09h
lea dx,dbResultAB
int 21h
;выводим значение счетчика
mov al,dbAB
call Number
;выводим результат по последовательности 'bас'
mov ah,09h
lea dx,dbResultBA
int 21h
;выводим значение счетчика
mov al,dbBA
call Number
;ожидаем любую клавишу и выходим в ДОС
xor ax,ax
int 16h
ret
;подпрошрамма вывода числа
Number: xor ah,ah
;сситема счисления
mov bx,10
;счетчик выводимых цифр
xor cx,cx
;получаем остаток от деления
@@04: xor dx,dx
div bx
;сохраняем остаток в стеке
push dx
;увеличиваем счетчик цифр в стеке
inc cx
;пока АХ не равно нулю
or ax,ax
jnz @@04
;выводим из стека
@@05: pop ax
;преобразовываем в символ
or al,'0'
;недокументированна функция вывод телетайпом,упрощенный аналог функции 02h прерывания 21h
int 29h
loop @@05
ret
;выводимые сообщения
dbEnter db 10,13,'Enter string:$'
dbResultAB db 10,13,'Result "abc":$'
dbResultBA db 10,13,'Result "bac":$'
;счетчики
dwCount label word
dbAB db ?
dbBA db ?
;вводима строка
dbMax db MaxString
dbLen db ?
dbData db MaxString dup(?)
end begin
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа