Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите нарисовать блок - схему к данной программе? (TASM)  (Прочитано 8948 раз)
0 Пользователей и 6 Гостей смотрят эту тему.
Lena
Новенький

ru
Offline Offline

« : 12-03-2013 15:17 » new

нарисуйте хотя бы схематично в паинте пожалуйста

Добавить новый элемент массива, если его значение не равно значениям элементов заданного массива А(I). I = 1,2,..,5. Максимальная размерность массива А(I)=10. Добавляемые числа находятся в массиве B(J). J = 1,2,...,5.

Код:
model small 
.stack 100h ;стэк 256 Кб
.data
    len2 dw 5 ;длина массива-результата
    len equ 5 ;длина исходных массивов
    mas2 db 2, 3, 6, 7, 8 ;массив откуда брать
    void dw ? ;раздел между массивами для удобного просмотра
    mas1 db 1, 2, 3, 4, 5 ;массив - результат
.code
    start: ;метка начала программы
        mov ax,@data ;инициализируем ds сегмнтом данных
        mov ds,ax       ; через регистр ах
        mov cx,len ;цикл по всему массиву
        xor si,si ;исключающее или - обнуление счетчика цикла
    cicl1: ;цикл по массиву для добавления
        mov al,mas2[si] ;берем поочередно каждый элемент
        push cx ;запоминаем сх в стэк для вложенных циклов
        mov cx, len2 ;вложенный цикл по всему результирующему массиву
        xor di,di ;обнуляем счетчик второго цикла
    cicl2: ;пробегаем по массиву результату.
        cmp al,mas1[di] ;если в массиве таких элементов нет
        je metka
        inc di
    loop cicl2 ;то добавим
        mov di,len2       ;добавление
        mov mas1[di],al ;элемента в массив
        inc len2            ;увеличение длины массива
    metka:
        pop cx              ;если есть, то следующая итерация
        inc si                ;переход к следующему элементу
    loop cicl1 ;все элементы добавлены
    exit: ;выход
        mov ax,4c00h ;4с - номер функции выхода, 0 - код ошибки
        int 21h ;вызов библиотеки прерываний DOS
end start ;вход в программу с метки start
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 12-03-2013 15:54 » 

Lena, а смысл? Ведь тебе надо научиться рисовать блок-схемы, а не нам тут.

У тебя нет описания значков блок-схем? Или ты чего-то не понимаешь?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Lena
Новенький

ru
Offline Offline

« Ответ #2 : 12-03-2013 16:39 » 

я не понимаю алгоритм работы программы

Добавлено через 21 секунду:
для того и нужна блок-схема, чтобы понять работу
« Последнее редактирование: 12-03-2013 16:39 от Lena » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 12-03-2013 17:19 » 

Lena, если у тебя сложности с алгоритмами, то ассемблер как средство программирования - явно неудачный выбор.

Вообще блок-схема рисуется не для того, чтобы понять алгоритм, а для того, чтобы понять, какие куски когда к каким шагам алгоритма относятся. Для ассеблера это актуально потому, что это низкоуровневый язык. Т.е. единственное действие алгоритма вынужденно записывается несколькими машинными командами с привлечением всяких технических подробностей: регистры, флаги, форматы данных, планирование ресурсов и т.п.

Поэтому я предлагаю начать с описания своими словами русским языком самого алгоритма решения задачи.

Представь, что массив это колода карт. Тебе не важны их масти, а важны только достоинства: туз, двойка, тройка и т.д. до короля - это как бы числа.

Вот у тебя есть 2 маленькие колоды по 5 карт в каждой: назовём их А и Б. Также у тебя есть куча с фишками красного и чёрного цветов.

По условию задачи тебе доступны следующие действия:
- взять карту с верха колоды А и положить перед собой слева и отложить красную фишку,
- взять карту с верха колоды Б и положить перед собой справа и отложить чёрную фишку,
- сравнить две лежащие перед тобой карты и сказать, одинакового они достоинства или разного,
- положить любую лежащую перед тобой карту в низ колоды А,
- положить правую лежащую перед тобой карту в низ колоды Б,
- узнать, сколько штук фишек отложено каждого цвета,
- вернуть все отложенные фишки в кучу

При помощи этих действий тебе надо, чтобы карты из колоды Б, достоинства которых отсутствуют в колоде А, оказались в колоде А.

Как ты будешь действовать? (Ну можешь сесть за стол, взять карты, вместо фишек спички или что-нибудь такое и пробуй.) Главное, выполнять только действия из списка, никаких других операций не разрешается. Действу и записывай шаги.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
LemmonRus
Помогающий

ru
Offline Offline
В правильно заданном вопросе 90% ответа.


« Ответ #4 : 13-03-2013 12:49 » 

Расписываю простейшую методику построения:
1)Кладешь листок бумаги  в клетку перед собой берешь ручку и начинаешь чертить линию вниз
каждая строчка кода 3 клетки.
2)Дойдя до метки рисуешь кружок и пишешь название метки.
3)Дойдя до перехода по метке   ведешь линию на метку если переход безусловный, если условный треугольник .
(если метка еще не введена в код делаешь заметку о метке и тупо следуешь в низ).
4)Разбираешься в соответствующих строках в цикле.
Записан
LemmonRus
Помогающий

ru
Offline Offline
В правильно заданном вопросе 90% ответа.


« Ответ #5 : 13-03-2013 13:03 » 

Твой алгоритм по данной методе:
model small
.stack 100h ;стэк 256 Кб
.data
    len2 dw 5 ;длина массива-результата                                                                  
    len equ 5 ;длина исходных массивов
    mas2 db 2, 3, 6, 7, 8 ;массив откуда брать
    void dw ? ;раздел между массивами для удобного просмотра
    mas1 db 1, 2, 3, 4, 5 ;массив - результат
.code
    start: ;метка начала программы
        mov ax,@data ;инициализируем ds сегмнтом данных
        mov ds,ax       ; через регистр ах
        mov cx,len ;цикл по всему массиву
        xor si,si ;исключающее или - обнуление счетчика цикла
    cicl1: ;цикл по массиву для добавления<-----------------------------------------------------|
        mov al,mas2[si] ;берем поочередно каждый элемент                                         |
        push cx ;запоминаем сх в стэк для вложенных циклов                                         |
        mov cx, len2 ;вложенный цикл по всему результирующему массиву                    |
        xor di,di ;обнуляем счетчик второго цикла                                                            |
    cicl2: ;пробегаем по массиву результату. <--------------------------------------------         |                                                        
        cmp al,mas1[di] ;если в массиве таких элементов нет                                  |        |
|-----je metka     (Условный переход)                                                                     |        |
|            |                                                                                                                  |        |
|         inc di                                                                                                               |         |
|    loop cicl2 ;то добавим-----------------------------------------------------------------------|         |
|        mov di,len2       ;добавление                                                                                   |
|        mov mas1[di],al ;элемента в массив                                                                        |
|        inc len2            ;увеличение длины массива                                                            |
 ->    metka:                                                                                                                       |
        pop cx              ;если есть, то следующая итерация                                               |
        inc si                ;переход к следующему элементу                                                   |
    loop cicl1 ;все элементы добавлены-------------------------------------------------------------|
    exit: ;выход
        mov ax,4c00h ;4с - номер функции выхода, 0 - код ошибки
        int 21h ;вызов библиотеки прерываний DOS
end start ;вход в программу с метки start
« Последнее редактирование: 13-03-2013 13:05 от LemmonRus » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines