netlib.narod.ru | < Назад | Оглавление | Далее > |
Действительно ли настолько трудно писать хороший ассемблерный код для PC? Да! Благодаря исключительно причудливой природе семейства процессоров x86, ассемблер фундаментально отличается от других языков и бесспорно труднее для работы. С другой стороны, потенциальные возможности ассемблера гораздо больше, чем у других языков программирования.
Чтобы понять причины этого, рассмотрим, как пишутся программы. Программист изучает требования к приложению, разрабатывает решение на каком-либо уровне абстракции, и затем воплощает этот проект в коде. Без надлежащей проработки, преобразование при переходе от концепции к реализации может катастрофически уменьшить быстродействие. Например, программист, который пишет процедуру поиска в списке из 100 000 отсортированных элементов, и использует линейный поиск вместо двоичного, получит обескураживающе медленную программу.
Независимо от того, насколько хорошо реализован утвержденный проект, языки высокого уровня, подобные C/C++ и Паскалю неизбежно добавляют приводящее к потере эффективности преобразование, как показано на рис. 2.1.
Рис. 2.1. Приводящее к потере эффективности преобразование в языке высокого уровня
Процесс преобразования проекта в исполняемый код с применением языка высокого уровня включает два преобразования: первое выполняется программистом, создающим исходный код, а другое выполняется компилятором, превращающим исходный код в команды машинного языка. Следовательно, машинный код, генерируемый компилятором, обычно не столь оптимально соответствует требованиям оригинального проекта.
Языки высокого уровня предоставляют искусственные среды, которые относительно хорошо приспособлены для человека с навыками программирования и облегчают переход от проекта к реализации. Цена такой простоты реализации — значительная потеря эффективности при преобразовании исходного кода в машинный язык. Это особенно верно для реального и 16-разрядного защищенного режима в семействе процессоров x86 с его специализированными командами адресации к памяти и сегментной архитектурой памяти, не слишком хорошо соответствующих дизайну компиляторов. Даже 32-разрядный режим в процессоре 386 и его преемниках с более мощными режимами адресации, предлагает меньше регистров, чем хотелось бы компилятору.
С другой стороны, ассемблер является просто ориентированным на пользователя представлением машинного языка. В результате ассемблер предоставляет более сложную среду программирования — голое оборудование и системное программное обеспечение, — но правильно сконструированные программы на ассемблере не проходят через понижающие эффективность преобразования, что показано на рис. 2.2.
Рис. 2.2. Правильно сконструированные программы на ассемблере не теряют эффективности при преобразовании
При создании программы на ассемблере требуется только одно преобразование, и оно полностью находится под контролем программиста. Ассемблер не выполняет преобразований при переходе от исходного кода к машинному языку; вместо этого он заменяет инструкции ассемблера на команды машинного языка один к одному. В результате у программиста появляется возможность создать код на машинном языке, который в точности соответствует потребностям каждой задачи, выполняемой приложением.
Ключевой фигурой, конечно, является программист, поскольку в ассемблере программист должен по существу полностью самостоятельно выполнить преобразование от спецификации приложения до машинного языка. (Ассемблер просто выполняет прямой перевод языка ассемблера в машинный язык.)
Первая часть оптимизации языка ассемблера — вы сами. Ассемблер — это всего лишь инструмент, позволяющий проектировать программы на машинном языке, не думая в шестнадцатеричных кодах. Поэтому те, кто программирует на ассемблере — в отличие от всех других программистов, — должны полностью отвечать за качество их кода. Поскольку ассемблер не предоставляет никакой помощи, кроме генерации машинного языка, программист, использующий ассемблер должен уметь напрямую кодировать любую конструкцию программирования и управлять PC на самом низком уровне — операционной системы, BIOS и даже оборудования, если необходимо. Языки высокого уровня решают большинство этих задач незаметно для программиста, но в ассемблере все это справедливая — и необходимая — игра, которая подводит нас к другому аспекту оптимизации ассемблера: знанию.
В мире PC у вас никогда не будет достаточно знаний, и каждый кусочек, который вы добавите в свою копилку, будет делать ваши программы лучше. Очень важно полное знакомство с различными API операционной системы и интерфейсами BIOS; поскольку эти интерфейсы хорошо документированы и достаточно просты, мой совет — возьмите одну или две хороших книги и заставьте себя прочитать их. Также требуется знакомство с аппаратным обеспечением PC. Эта тема охватывает множество вещей — видеокарты, клавиатура, последовательные и параллельные порты, таймер и каналы DMA, организация памяти, и многое другое. Большинство аппаратного обеспечения хорошо документировано и статьи о программировании основных компонентов оборудования встречаются в литературе достаточно часто, так что эти знания при желании тоже легко получить.
Самый важный и наиболее трудный для изучения элемент аппаратного обеспечения — центральный процессор. Семейство центральных процессоров x86 имеет сложный, нерегулярный набор команд и, в отличие от большинства других процессоров, не является ни простым, ни хорошо приспособленным для быстродействующего кода. Более того, ассемблер настолько сложен для изучения, что в большинстве статей и книг приводят ассемблерный код, который просто кое-как работает, вместо кода, который подводит процессор к грани возможного. Фактически, поскольку большинство статей и книг написаны для начинающих программировать на ассемблере, доступно очень мало информации о том, как создавать высококачественный ассемблерный код для процессоров семейства x86. В результате знание об эффективном программировании наиболее трудно получить. Значительная часть этой книги посвящена поискам такого знания.
![]() |
Хочу предупредить: независимо от того, как много вы знаете о программировании на ассемблере для PC, всегда есть много того, что еще предстоит узнать. | |
netlib.narod.ru | < Назад | Оглавление | Далее > |