![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]()
|
![]() |
![]() |
![]() |
#12 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]()
7. Загрузить COMMAND.COM и настроить его по месту в памяти не используя функцию 4Bh прерывания 21h
Код:
Код:
Код:
|
![]() |
![]() |
![]() |
#13 | |||
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]()
10. Перечитывая Зубкова наткнулся на еще один способ
Код:
Цитата:
11. через int 2Eh Код:
Цитата:
Цитата:
Код:
|
|||
![]() |
![]() |
![]() |
#14 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]()
13.
Код:
|
![]() |
![]() |
![]() |
#15 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]()
ОСНОВНЫЕ ПРАВИЛА НАПИСАНИЯ ПРОГРАММ НА ЯЗЫКЕ АССЕМБЛЕРА
Данные правила относятся не только к программированию на языке ассемблера, но и к программированию на других языках. Может быть, их трудно понять, не имея навыка в программировании, но «незнание основ не освобождает от ответственности». Начинайте с комментариев Начните с написания инструкции для пользователя — для чего создается и каковы возможности вашей программы. А теперь немного усложните вашу инструкцию по применению вашей программы, подразумевая под «пользователем» программиста, использующего написанный вами код — зачастую этим программистом-исследователем будете вы сами. Акт записи на обычном языке описания того, что делает программа и что делает каждая функция в программе, является критическим шагом в мыслительном процессе. Хорошо построенное, грамматически правильное предложение — признак ясного мышления. Если вы не можете это записать, то велика вероятность того, что вы не полностью продумали задачу или метод ее решения. Плохая грамматика и построение предложения являются также показателем поверхностного мышления. Поэтому первый шаг в написании любой программы — записать, что именно и как делает программа. Итак, комментарии для вашей программы уже готовы. Теперь возьмите ваше описание по использованию и добавьте вслед за каждым абзацем блоки кода, реализующие функции, описанные в этом абзаце. Оправдание: «У меня не было времени, чтобы добавить комментарии» на самом деле означает — «Я писал этот код без проекта системы и у меня нет времени воспроизвести его». Если создатель программы не может воспроизвести идеи, воплощенные в программный проект, то кто же тогда сможет? Работа программиста состоит из двух частей: разработать приложение для пользователя и сделать возможным дальнейшее сопровождение программы. Единственный способ решить вторую часть задачи — комментировать код. Причем комментарии должны описывать не только, что делает код, но и предположения, принятый подход и причины, по которым вы выбрали именно его. Кроме того, необходимо, чтобы комментарии также соответствовали коду. Пишите код так, словно тот, кто будет заниматься его поддержкой, — опасный психопат, знающий где вы живете. Хотя вы можете считать, что ваш код полностью очевиден и может служить примером ясности, без правильных комментариев понять его постороннему достаточно трудно. Парадокс заключается в том, что спустя неделю вы сами можете оказаться в роли этого постороннего. Старайтесь использовать следующий подход при написании комментариев:
|
![]() |
![]() |
![]() |
#16 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]()
Читайте код
Все писатели — это читатели. Вы учитесь, когда смотрите, что делают другие писатели. Я настоятельно рекомендую, чтобы, как минимум, члены группы программирования читали код друг у друга. Читатель может найти ошибки, которые вы не увидели, и подать мысль, как улучшить код. Для вас лучше присесть с коллегой и просто разобрать код строка за строкой, объясняя, что и как делается, получить какую-то обратную связь и совет. Для того чтобы подобное упражнение принесло пользу, автор кода не должен делать никаких предварительных пояснений. Читатель должен быть способен понимать код в процессе чтения. Если вам пришлось объяснять что-то вашему читателю, то это значит, что ваше объяснение должно быть в коде в качестве комментария. Добавьте этот комментарий, как только Вы его произнесли; не откладывайте этого до окончания просмотра. Разлагайте сложные проблемы на задачи меньшего размера На самом деле это также и правило литературного стиля. Если очень трудно объяснить точку зрения за один раз, то разбейте изложение на меньшие части и по очереди объясняйте каждую. То же самое назначение у глав в книге и параграфов в главе. Используйте язык полностью Некоторые программисты считают одним из недостатков языка ассемблера большее, по сравнению с языками высокого уровня, количество команд, но, по-моему, это одно из достоинств языка ассемблера. Проблема должна быть хорошо продумана перед тем, как она сможет быть решена Это относится не только к программированию на языке ассемблера. Отредактируйте свой код. Программа должна писаться не менее двух раз Раньше, когда вы изучали в школе литературу, вам никогда не приходило в голову сдавать черновик письменного задания, если Вы, конечно, рассчитывали на оценку выше тройки. Тем не менее, многие компьютерные программы являются просто черновиками и содержат столько же ошибок, сколько и черновики ваших сочинений. Хороший код программы должен быть сначала написан, а затем отредактирован в целях улучшения (под «редактированием» имеется в виду «исправление»). Редактирование, как правило, приводит к сокращению кода, а небольшие программы выполняются быстрее. Оптимизация программ на языке ассемблера Итак ваша программа заработала, а теперь постарайтесь переделать ее так, чтобы она стала максимально компактной и в тоже время максимально быстродействующей. Такая оптимизация достигается в три этапа:
|
![]() |
![]() |
![]() |
#17 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]()
Флёнов Михаил Евгеньевич — российский программист, работал в журнале "Хакер" (рубрики "Hack-FAQ" и "Кодинг для программистов"), печатался в журналах "Игромания" и "Chip-Россия", автор книг по программированию и работе на компьютере:
Советы по оптимизации от Михаила Фленова ЗАКОН # 1 Оптимизировать можно все. Даже там, где вам кажется, что все и так работает быстро, можно сделать еще быстрее. Идеального кода не существует. Чтобы достичь максимального результата, нужно действовать последовательно и желательно в том порядке, который описан ниже. Помните, что любую задачу можно решить минимум двумя способами, ваша цель — выбрать наилучший метод, который обеспечит желаемую производительность и универсальность. ЗАКОН # 2 Первое, с чего нужно начинать, — поиск самых слабых и медленных мест. Зачем начинать оптимизацию с того, что и так работает достаточно быстро? Если вы будете оптимизировать сильные места, то можете нарваться на неожиданные конфликты. Да и эффект будет минимален. Когда-то меня посетила одна невероятная идея — написать собственную игру в стиле Doom. Четыре месяца невероятного труда, и нечто похожее на движок уже было готово. Был создан один голый уровень, по которому можно было перемещаться, и я с чувством гордости побежал по коридорам. Предстояло добавить монстров и атрибуты, да еще и наделить все это искусственным интеллектом. Но кому нужен движок, который в "голом виде" тормозит со страшной силой? Понятно что виртуальный мир нужно было оптимизировать. Целый месяц борьбы с кодом и вылизывания каждого оператора движка. Результат — всё стало прорисовываться на 10% быстрей, но "тормоза" не исчезли. Неожиданно выяснилось, что самое слабое место — вывод на экран. Движок просчитывал сцены достаточно быстро, а "пробоиной" был именно вывод изображения. Пара часов колдовства, и я выжал из видеокарты все возможное. Откомпилировав движок, я снова погрузился в виртуальный мир. Одно нажатие клавиши "вперед", и я очутился у противоположной стены. Никаких тормозов, сумасшедшая скорость просчета и моментальный вывод на экран. Как видите, ошибка была в неправильном определении слабого места движка. Потрачен месяц на оптимизацию математики, а в результате мизерные 10% прироста в производительности. Но когда было найдено реально слабое звено, то производительность была повышена в несколько раз. Начинайте оптимизацию со слабых мест. При ускорении работы самого слабого звена вашей программы, возможно, и не понадобится ускорять другие места. Вы можете потратить дни на оптимизацию сильных сторон и увеличить производительность только на 10% (что может оказаться недостаточным), или несколько часов на улучшение слабой части, и получить улучшение в 10 раз! Слабые места компьютера Некоторые программисты гонятся за мегагерцами процессора, но сидят на доисторической видеокарте от S3, жестком диске на 5400 оборотов и с 32 Мбайтами памяти. Посмотрите "потроха" своего компьютера и оцените его содержимое. Если вы увидели, что памяти у вас не более 64 Мбайт, то это — самое слабое звено, купите себе 128, а лучше 256, а еще лучше 512 Мбайт памяти и наслаждаетесь ускорением работы Delphi, Photoshop и других "тяжелых" программ. Наращивание сотни мегагерц у процессора даст более маленький прирост в скорости. Если вы используете тяжелые приложения при нехватке памяти, то процессор начинает тратить слишком много времени на загрузку и выгрузку данных. Если в вашем компьютере достаточно оперативной памяти, то процессор уже занимается только расчетами и не расходуется по лишним загрузкам-выгрузкам. То же самое с видеоадаптером. Если видеокарта "слабенькая", то процессор будет просчитывать сцены быстрей, чем они будут выводиться на экран. А это грозит простоями и минимальным приростом производительности. |
![]() |
![]() |
![]() |
#18 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]()
ЗАКОН # 3
Следующим шагом вы должны разобрать все операции по косточкам и выяснить, где происходят регулярно повторяющиеся операции. Начинать оптимизацию нужно именно с них. Допустим, у вас есть следующая программа: Код:
Теперь посмотрите еще раз на наш код. Больше ничего не видно? Программа использует цикл: "Пока B<100, будет выполняться операция Х:=Х+М[B]". Это значит, что процессору придется выполнить 100 переходов с шага 5 на шаг 3. А это немало. Можно ли что-нибудь оптимизировать? Внутри цикла выполняется две строки: 3 и 4. А что, если мы внутри цикла размножим их 2 раза: Код:
А что, если совсем отказаться от операций перехода? Код:
Любую циклическую операцию можно оптимизировать. Допустим, у провайдера есть несколько телефонов доступа. Вы каждый день перезваниваете на каждый из них в надежде найти свободный. Хотя провайдер обязан оптимизировать свои пулы модемов в один, чтобы не надо было трезвонить по всем номерам сразу. Но не у каждого пользователя хорошая связь с любой телефонной станцией города. Поэтому провайдеры держат пулы на разных станциях, чтобы вы могли выбрать тот, с которым связь лучше. Поставьте программу-дозвонщик, которая сама будет перебирать номера телефонов. Другой пример — вам на 1 час досталась карточка нового провайдера. Заносить ее в программу дозвона не имеет смысла, потому что вы можете больше никогда не позвонить ему. Из-за этой одноразовой операции вам придется перенастраивать свой дозвонщик на нового провайдера и потом обратно, а выигрыш практически нулевой, потому что пока вы меняете настройки, уже можно было дозвониться стандартными средствами Windows. Вывод — правильно выбирайте средства для выполнения необходимых задач. ЗАКОН # 4 (Этот закон — расширение предыдущего.) Оптимизировать одноразовые операции — это только потеря времени. Сто раз подумай, прежде чем начать мучиться с редкими операциями. Программисту нужно разослать приглашения на свадьбу. Вместо того чтобы набрать их на печатной машинке, программист пишет специальную программу. Написание заняло один день, столько же — отладка программы. Главная ошибка — неправильная оптимизация своего труда. Легче набрать шаблон в любом текстовом редакторе и потом только менять фамилии приглашенных. Но даже если нет текстового редактора, писать программу действительно нет смысла. Затраты большие, а пользоваться — только один раз. Получается, что одноразовые операции оптимизировать просто бессмысленно. Затраты в этом случае себя не окупают, поэтому не стоит тратить свои нервы на этот бессмысленный труд. В данном случае крутым считается не тот, кто целый день промучился и ничего не добился, а тот, кто выполнил свою работу наиболее быстро и эффективно. |
![]() |
![]() |
![]() |
#19 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]() ЗАКОН # 5 Нужно знать внутренности компьютера и принципы его работы. Чем лучше вы знаете, каким образом компьютер будет выполнять ваш код, тем лучше вы сможете его оптимизировать. Тут трудно привести полный набор готовых решений, но некоторые приемы я постараюсь описать. Старайтесь поменьше использовать вычисления с плавающей запятой. Любые операции с целыми числами выполняются в несколько раз быстрее. Операции умножения и тем более деления также выполняются достаточно долго. Если вам нужно умножить како-то число на 3, то для процессора будет легче три раза сложить одно и то же число, чем выполнить умножение. А как же тогда экономить на делении? Вот тут нужно знать математику. У процессора есть такая операция, как сдвиг. Вы должны знать, что процессор думает в двоичной системе, и числа в компьютере хранятся именно в ней. Например, число 198 для процессора будет выглядеть как 11000110. Теперь посмотрим, как работают операции сдвига. Сдвиг вправо — если сдвинуть число 11000110 вправо на одну позицию, то последняя цифра исчезнет, и останется только 1100011. Теперь введите это число в калькулятор и переведите его в десятичную систему. Ваш результат должен быть 99. Как видите — это ровно половина числа 198. Вывод: когда вы сдвигаете число вправо на одну позицию, то вы делите его на 2. Сдвиг влево — возьмем то же самое число 11000110. Если сдвинуть его влево на одну позицию, то с правой стороны освободится место, которое заполняется нулем — 110001100. Теперь переведите это число в десятичную систему. Должно получится 396. Что оно вам напоминает? Это 198, умноженное на 2. Вывод: когда вы сдвигаете число вправо, то вы делите его на 2; когда сдвигаете влево, то умножаете его на 2. Так что используйте эти сдвиги везде, где возможно, потому что сдвиги работают в десятки раз быстрее умножения и деления. При создании процедур не обременяйте их большим количеством входных параметров. Перед каждым вызовом процедуры ее параметры поднимаются в специальную область памяти (стек), а после входа изымаются оттуда. Чем больше параметров, тем больше расходы на общение со стеком. Тут же нужно сказать, что вы должны действовать аккуратно и с самими параметрами. Не вздумайте пересылать процедурам переменные, которые могут содержать данные большого объема в чистом виде. Лучше передать адрес ячейки памяти, где хранятся данные, а внутри процедуры работать с этим адресом. Вот представьте себе ситуацию, когда вам нужно передать текст размером в один том "Войны и мира".... Перед входом в процедуру программа попытается вогнать все это в стек. Если вы не увидите его переполнения, то задержка точно будет значительная. В самых критичных моментах (как, например, вывод на экран) можно воспользоваться языком Assembler. Даже встроенный в Delphi или C++ ассемблер намного быстрее штатных функций языка. Ну а если скорость в каком-то месте уж слишком критична, то код ассемблера можно вынести в отдельный модуль. Там его нужно откомпилировать с помощью компиляторов TASM или MASM и подключить к своей программе. Ассемблер достаточно быстрая и компактная вещь, но писать достаточно большой проект только на нем — это очень сложно. Поэтому я советую им не увлекаться и использовать его только в самых критичных для скорости местах. ЗАКОН # 6 Для сложных расчетов можно заготовить таблицы с заранее рассчитанными результатами и потом использовать эти таблицы в реальном режиме времени. Когда появился первый Doom, игровой мир поразился качеству графики и скорости работы. Это действительно был шедевр программистской мысли, потому что компьютеры того времени не могли рассчитывать трехмерную графику в реальном времени. В те годы еще даже и не думали о ЗD-ускорителях, и видеокарты занимались только отображением информации и не выполняли никаких дополнительных расчетов. Как же тогда программистам игры Doom удалось создать трехмерный мир? Секрет прост — во время игры микропроцессор не просчитывает сцены, все сложные математические расчеты были сделаны заранее и занесены в базу данных, которая запускается при старте программы. Конечно же занести все возможные результаты невозможно, поэтому база хранила основные результаты. Когда нужно было получить расчет значения, которого не было в заранее рассчитанной таблице, то бралось наиболее приближенное число. Таким образом, Doom получил отличную производительность и достаточное качество ЗD-картинки. Оцените качество освещения и теней в сценах виртуального мира игры Quake. Совмещение высокого графического качества сцен и в то же время высокой скорости работы игры сделано за счет таблиц с заранее рассчитанными значениями. |
![]() |
![]() |
![]() |
#20 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]() ЗАКОН # 7 Чаще всего оптимизация может привести к нестабильности исполняемого кода, потому что для увеличения производительности некоторые убирают ненужные на первый взгляд проверки. Запомните, что ненужных проверок не бывает! Если вы думаете, что какая-то нестандартная ситуация может и не возникнуть, то она не возникнет только у вас. У пользователя, который будет использовать вашу программу, может возникнуть все, что угодно. Он обязательно нажмет на то, на что не нужно, или введет неправильные данные. Обязательно делайте проверки всего того, что вводит пользователь. Делайте это сразу же и не ждите, когда введенные данные понадобятся. Лишних проверок не бывает. Не делайте проверки в цикле, а выносите за его пределы. Любые лишние операторы if внутри цикла очень сильно влияют на производительность, поэтому по возможности проверки нужно делать до или после цикла. Циклы — это слабое место любой программы, поэтому оптимизацию надо начинать именно с них и стараться не вставлять в них лишние проверки. Внутри циклических операций не должно выполняться ничего лишнего — ведь это будет повторено много раз!.. Итог Здесь были изложены только основы оптимизации. Оптимизация — это процесс творческий, и в каждой отдельной ситуации к нему можно подойти с разных сторон. Для более глубокого познания оптимизации вам нужно изучать принципы работы процессора и операционных систем. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Программа для шифрования раздела с виндой | Жека90 | Софт | 1 | 12.06.2012 18:17 |
макрос для решения квадратных уравнений (перемещено из раздела Excel) | sashkkk | Помощь студентам | 3 | 22.09.2010 23:06 |
Собираем команду для FAQ | Aexx | Свободное общение | 112 | 14.10.2009 09:20 |
Формат по образцу для раздела... | Busine2009 | Microsoft Office Word | 0 | 28.07.2009 08:05 |
Программа для копирования заданного раздела. С++ | x007 | Общие вопросы C/C++ | 5 | 23.04.2009 23:52 |