Большой проект - и без ошибок?

Тема в разделе "WASM.BEGINNERS", создана пользователем TOLSTOPUZ, 15 дек 2008.

  1. TOLSTOPUZ

    TOLSTOPUZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    509
    Итак, начинаю новый проект.
    Сначала дело "летит". всё легко и понятно.
    Но вот программа разрастается.
    Постепенно в процессе работы в руках появляется авторучка, и на клочке бумаги появляются первые аккуратные столбики с записанными переменными.
    Вскоре столбики перестают быть аккуратными, а бумажек становится несколько. И вот раздаётся "первый звоночек" - смотрю на процедуру и не понимаю - а что это вообще такое?
    Возвращаюсь по коду и смотрю...

    Дайте грамотный совет - как разбить программу на куски (что-ли...)
    или кто как создаёт большие проекты без путаницы? Поделитесь опытом.
     
  2. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    1) Процедуры должны быть по возможности автономными. Это упростит отладку и даст возможность использовать их в других проектах.
    2) Используй локальные переменные и метки.
    3) Попробуй использовать IDE. Вот тема была
     
  3. _Aspire

    _Aspire New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    62
    1. Комментарии :)
    2. Использовать "говорящие" имена переменных, меток и процедур.
    3. Если ты пишешь на асме, то желательно пользовать регистры по их назначению, т.е. есх - для счетчика или индексации, esi & edi для указателей на структуры и буфера и т.д.
     
  4. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    RadAsm в руки.
    Есть список:
    процедур, переменных, структур, меток ...
    Можно коменты написать к каждой:
    переменной, метке, структуре, прочедуре...

    Навигация по коду.
    Ткнул на переменной, метке, структуре, прочедуре... и перешел к месту ее объявления.
    Удачи.
     
  5. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    ax - аккумулятор
    bx - база
    cx - счётчик
    dx - данные

    si - смещение входных данных
    di - смещение выходных данных

    bp - смещение на локальных переменных и параметров
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    TOLSTOPUZ (Содрано у Питера Нортона)
    Создание процедур в виде готовых модулей предполагает не «изобретение велосипеда» каждый раз при написании новой программы, а построение новых программ из уже готовых (отлаженных, проверенных и оптимизированных) модулей. Следующие рекомендации должны помочь Вам при оформлении процедур в виде готовых модулей. Если хотите, определите свои рекомендации, но в любом случае, все время придерживайтесь одного и того же. Ваша работа значительно упростится, если Вы будете последовательными.
    1. Сохраняйте и восстанавливайте всегда все регистры (их значения), кроме тех случаев, когда процедура передает значение в регистре.
    2. Будьте последовательны в применении для передачи информации одних и тех же регистров. Например:
    • DL, DX, EDX — для передачи байта, слова или двойного слова.
    • AL, AX, EAX — для возвращения байта, слова или двойного слова.
    • BX:AX, EBX:EAX — для возвращения двойного или счетверенного слова
    • DX, EDX — передача и возвращение адресов
    • CX, ECX — счетчик повторения и другие счетчики
    • CF — устанавливается при ошибке; код ошибки возвращается в одном из регистров, например в AL, AX или EAX
    3. Определяйте все внешние взаимодействия процедуры в заголовке-комментарии:
    • информация, необходимая на входе;
    • возвращаемая информация (изменяемые регистры) ;
    • вызываемые процедуры;
    • используемые переменные (считывания, записи и т. д.).
    Существует четко просматриваемая связь между модульным конструированием в программировании и модульным конструированием в инженерном искусстве. Инженер-электрик, например, может создать очень сложный прибор из блоков, выполняющих различные функции, не зная точно, как именно работает каждый блок в отдельности. Но если каждый блок применяет свое напряжение питания или оригинальную, не стыкующуюся с другими блоками форму контактов, то это отсутствие единообразия составляет главную причину головной боли бедняги-инженера, который должен умудриться как-то подавать разное напряжение к каждому блоку и создавать специальные виды соединений между блоками. Не очень-то приятное развлечение, но к счастью для инженера, существуют стандарты, допускающие лишь небольшое число различных напряжений. Таким образом, получается, что надо обеспечить подачу, скажем, всего четырех различных напряжений вместо того, чтобы к каждому блоку подавать свое определенное напряжение.
    Модульное конструирование и стандартные интерфейсы в языке ассемблера не менее важны. Как Вы сами увидите, эти правила значительно упростят ваше программирование. Давайте рассмотрим эти правила детальнее.
    Сохраняйте и восстанавливайте всегда все регистры (их значения), кроме тех случаев, когда процедура передает значение в регистре. У микропроцессора не так много регистров. Сохраняя значения регистров в начале процедуры, Вы освобождаете регистры для использования в самой процедуре. Единственное исключение составляют процедуры, которые должны вернуть некоторую информацию процедурам, их вызывающим.
    Короткие процедуры также помогают в решении проблемы сокращения числа используемых регистров. Старайтесь писать процедуры, которые используют только один регистр. Это не только помогает сократить число используемых регистров, но также делает программу более легкой для написания и часто облегчает ее чтение и отладку.
    Будьте последовательными в использовании для передачи информации одних и тех же регистров. Работа станет легче, если Вы установите стандарты для обмена информацией между процедурами. Применяйте один регистр для передачи, а другой для получения информации. Вам также необходимо посылать адреса больших массивов информации, и для этого старайтесь использовать регистр EDX, это позволяет расположить данные в любом месте памяти.
    Резервируйте регистр ECX для использования в качестве счетчика повторений. Старайтесь использовать ECX всегда, когда Вам понадобится счетчик повторений или когда Вы захотите вернуть результат какого-либо подсчета.
    Устанавливайте флаг переноса (CF), когда происходит ошибка.
    Определяйте все внешние взаимодействия процедуры в заголовке-комментарии. Нет необходимости знать, как работает процедура, если все, что Вы хотите с ней делать, это использовать ее, и поэтому помещайте перед каждой процедурой детальный комментарий-заголовок. Этот заголовок содержит всю информацию, которую необходимо знать пользователю. Он говорит о том, что именно необходимо помещать в каждый регистр перед вызовом процедуры, а также говорит, какую информацию процедура возвращает.
    Большая часть процедур использует регистры для хранения своих переменных, но некоторые из процедур используют переменные, хранящиеся в памяти. Комментарий-заголовок должен сказать, какие из этих переменных только считываются, а какие изменяются. И, наконец, каждый заголовок должен содержать список вызываемых процедур. Пример такого заголовка:
    ;Это пример полного заголовка. В этом месте обычно приводится полное
    ;описание того, что данная процедура делает. Например: Процедура
    ;записывает сообщение «Sector» в первую строку. EDX содержит
    ;адрес сообщения «Sector»
    ;calls (вызываемые процедуры): GOTO_XY, WRITE_STRING
    ;Reads (переменные считываемые из памяти): STATUS_LINE_NO
    ;Writes (переменные считываемые и записываемые в память): DUMMY
    Когда бы Вы не захотели впоследствии использовать любую из написанных процедур, Вам достаточно просто взглянуть на заголовок, чтобы узнать, как ее использовать. Не будет нужды вникать в тонкости работы процедуры, чтобы разобраться в том, что именно она делает.
    Эти правила упрощают программирование на языке ассемблера, и Вы, конечно, будете их придерживаться, но необязательно с первой попытки написания процедуры — в этом просто нет необходимости. Первая версия процедуры или программы лишь пробный вариант. Часто программист не знает точно, как написать программу, которую он держит в голове, поэтому в черновом варианте пишите программу, не придерживаясь законов модульного конструирования. Сделайте примерный набросок будущей программы и убедитесь, что она работает. Затем вернитесь назад и перепишите каждую процедуру, чтобы она отвечала описанным рекомендациям.
     
  7. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Имя модуля - это имя файла. Например, в файле "String.Asm" - находится всё, что связано с операциями на строках. В самом файле, каждая процедура с префиксом модуля:

    String_RemoveChars
    String_ReplaceChars
    String_Parse
    ...

    Единство имён очень важно. Например, если есть такой объект: TWindow, значит необходимо иметь такие файлы:

    TWindow.Inc - описание структуры TWindow и сопутствующих констант или макро-расширений.
    TWindow.Asm - описание кода для работы с объектом (опять же с префиксами "TWindow_").

    Прежде чем наращивать код и добавлять функцональность - подумай: а нельзя ли это вынести в модуль.
     
  8. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Mikl___
    Многабукофф

    Обычно принято dx:ax, edx:eax

    Обычно принято al, ax, eax

    Ещё форматирование кода помогает (если формат удобен для ТЕБЯ).
     
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    murder
     
  10. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    TOLSTOPUZ
    Сильно зависит, какие средства для этого предоставляет язык, на котором пишешь.
     
  11. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    Опыт, опыт и только опыт...
    Помимо того, что уже написали:
    -каждая процедура должна выполнять только одну функцию (doThisAndThatAndSomethingElse - неприемлемо!
    -у тебя не должно быть длинных процедур - если она длинная, значит ее наверняка можно разбить на несколько коротких.
    -зависимости между разными кусками кода должны быть минимальны и четко видны. Нужно не использовать глобальные переменные, если их можно заменить локальными. Нужно делить код на модули, каждый из которых отвечает за какую-то часть логики программы и имеет *четко выраженный* интерфейс для работы с ним
    -как уже писали выше, комментируй каждый модуль и процедуру, это для асма особенно важно.
    -используй общий стиль именования переменных, комментирования и соглашений по программированию для всего проекта(в частности, как писали выше, одни и те же регистры для входных и выходных данных процедур)
    Если кратко, то максимальная инкапсуляция и документирование.

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

    Очень рекомендую "4 бандитов" - Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес Приемы объектно-ориентированного проектирования. Паттерны проектирования. Даже если ты не знаешь С++, то хотя бы поймешь, к чему нужно стремиться при проектировании программы, чтобы она оставалась стабильной и понятной через любое время после начала ее разработки

    ЗЫ: Помни, что настоящий программист ленив - настолько ленив, что пишет код аккуратно и комментирует его, т.к. ему потом лень будет разбираться в том, что он понаписал =)
    ЗЗЫ: нужно понимать, что красивые отступы, пробел после запятой, a = b + c вместо a=b+c нужно прежде всего тебе.
    ЗЗЗЫ: если хочешь запости какой-нибудь свой "развалившийся" проект, тут найдется много желающих его раскритиковать ;)
     
  12. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    scf
    4х бандитов... Рано ему еще это. Пусть для начала почитает Макконнелла "Совершенный код". Уж это будет ему более полезно. А потом уже бандитов, Александреску и тп.
     
  13. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    т.е. к примеру

    Код (Text):
    1. Процедура_0
    2.   действие 1
    3.   действие 2
    4.   действие 3
    5.   действие 4
    6. конец
    нужно разбить на

    Код (Text):
    1. Процедура_1
    2.   действие 1
    3.   действие 2
    4. конец
    5.  
    6. Процедура_2
    7.   действие 3
    8.   действие 4
    9. конец
    10.  
    11. Процедура_0
    12.   Процедура_1
    13.   Процедура_2
    14. конец
    ?
     
  14. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    K10
    Не совсем
    Если процедура выполняет 4 независимых действия - то ее следует разбить на 4 процедуры
    На практике почти не бывает случаев, когда процедура на ЯВУ занимает больше экрана и при этом ее кусок нельзя вынести в виде отдельной процедуры с осмысленным именем, параметрами и сутью
     
  15. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Процедурное программирование при разработке больших проектов использовать нецелесообразно. Даже если проект пишется на процедурном языке, всё равно лучше делать в стиле ООП. Основной принцип ООП это инкапсуляция, пишите библиотеки, модули, скрывайте в них то, чего не нужно видеть остальным частям проекта. Старайтесь как можно меньше делать зависимостей по данным, используйте описатели вместо указателей. Делайте функции манипулирующие сущностями. Например в винде доступа к данным окна нет, есть только методы позволяющие манипулировать им. Так что абстракция и инкапсуляция спасут отца русской демократии. ^)
     
  16. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    TOLSTOPUZ
    Я так думаю что ты уже много написал? И тебе все это надо разбить на части? Читал про автоматы? Там сложность схемы оценивается по количеству входов. Также и в программах - чем больше вызовов функций, ветвлений и циклов тем запутанней программа. Уменьшение сложности программы:
    1) Раздели интерфейс и вычислительную часть друг от друга (если раньше не разделил)
    3) Запиши в отдельные части никак не зависимые фрагменты программы (функции которых друг из друга не вызываются).
    3) Перемести в отдельные модули функции, общие по назначению (если 2 функции работают с жирафами, то они должны быть в одном модуле "Работа с жирафами").
    4) Делай меньше вызовов пользовательских функций (это те, которые ты написал и они определяют алгоритм программы, а не strcmp или printf). Одна пользовательская функция должна вызывать 1-2 других пользовательские функций.
     
  17. Argogo

    Argogo New Member

    Публикаций:
    0
    Регистрация:
    15 сен 2008
    Сообщения:
    5
    Адрес:
    Республика Крым
    Помимо всего прочего, это поможет восстановить исходники с помощью IDA, например, в случае их утраты, ну и может быть не тебе одному... :derisive:
     
  18. Dian

    Dian Member

    Публикаций:
    0
    Регистрация:
    19 июн 2008
    Сообщения:
    222
    От путаницы есть стандартные решения:
    1 язык высокого уровня
    2 ООП
    3 design patterns
    т.е. всегда строго по пути повышения уровня

    Большой проект без ошибок быть не может.
    Однако, от них тоже есть стандартные средства - QA
     
  19. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city
    Дабы не создать лишнюю тему, хочу поинтересоваться у умудренных опытом воинов дзена здесь =)

    Какие средства проектирования ПО и БД кто использует и почему.
    Я конечно понимаю, что есть Rational Rose, но 5 - 10 к зеленых платить хочется.
    Поэтому юзаю Umbrello UML modeler в KDE, так как бесплатен.
    Не хочется время и деньги тратить на изучение другого ПО, хочу услышать кто чем пользуется - все за и против. Платформа не принципиальна.
     
  20. Dian

    Dian Member

    Публикаций:
    0
    Регистрация:
    19 июн 2008
    Сообщения:
    222
    Реально хорошее средство проектирования пока, к сожалению, только одно - мозг :)
    Поэтому - бумага и карандаш :) Недорого и вполне работает.