Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скляров И. Изучаем Assembler за 7 дней (2010).pdf
Скачиваний:
1335
Добавлен:
23.02.2015
Размер:
2.11 Mб
Скачать

http://www.sklyaroff.ru

29

ДЕНЬ 2

Основы программирования на ассемблере

Каждая программа выполняется под управлением операционной системы (разумеется, если программа сама не является операционной системой). Операционная система выделяет для программы области памяти, загружает программу в память, передает ей управление, обеспечивает взаимодействие с другими программами и пр. Различные операционные системы это делают поразному, поэтому программа, написанная для ОС Windows, не будет работать в ОС MS-DOS, а тем более в ОС Linux. Конечно, можно написать программу, которая не будет рассчитана ни на одну известную операционную систему, но в этом случае она сама должна выполнять основные функции операционной системы, т. е. по сути, должна являться мини операционной системой.

Мы начнем изучать ассемблер под операционной системой MS-DOS (Microsoft Disk Operating System — дисковая операционная система фирмы Microsoft). Это одна из самых древних и простых операционных систем, которая использовалась еще на первых IBM PC. Не волнуйтесь, бежать искать дистрибутив с MS-DOS вам не потребуется. Если у вас на компьютере установлена Windows, то, значит, установлена и MS-DOS. MS-DOS является неотъемлемой частью любой из версий Windows. Последней отдельно распространяемой версией MS-DOS была версия 6.22, выпущенная в мае 1994 года.

Зачем нужно изучать ассемблер под устаревшей операционной системой? Во-первых, в отличие от Windows, которая является операционной системой защищенного режима, MS-DOS является операционной системой реального режима. Поэтому, программируя под MS-DOS, мы изучим программирование в реальном режиме. Вовторых, и самое важное, начинать программировать под MS-DOS проще в том плане, что не нужно изучать функции WinAPI и построение графических приложений, которые являются основными в Windows. Программирование в Windows осуществляется только через API функции, предоставляемые этой системой. Даже для того чтобы вывести что-нибудь в консольное окно в Windows нужно задействовать соответствующие API-функции, т. е. Windows скрывает от программиста работу с устройствами компьютера. Поэтому программирование на ассемблере под MS-DOS позволяет лучше познакомиться с возможностями ассемблера, т. к. MS-DOS дает возможность напрямую работать с устройствами компьютера (процессором, памятью, портами ввода/вывода). К сожалению MS-DOS, работающая внутри Windows, в отличие от чистой MS-DOS, существенно ограничивает работу DOS-приложений. Надо заметить, что в первых версиях

Windows построенных на не NT-ядре (Windows 3.1, Windows 95, Windows 98, Windows Millennium) никаких ограничений для DOS-приложений не существовало.

Возможно, любознательный читатель сейчас задался вопросом: каким образом MSDOS, которая является ОС реального режима может работать в Windows, которая является ОС защищенного режима? На самом деле в Windows работает не ОС MSDOS в чистом виде, а просто виртуальная машина, которая эмулирует работу MSDOS (virtual DOS-machine, VDM). Вспомните, на первом дне мы уже упоминали о VDM (см. разд. 1.5.1. "Режимы работы процессора").

VDM — это обычное приложение Windows, которое создает виртуальный компьютер, исполняющий MS-DOS. Благодаря VDM вы можете открыть сразу множество окон с исполняющимися независимо друг от друга DOS-программами (в реальной MS-DOS такое было невозможно). Программировать на ассемблере в VDM

http://www.sklyaroff.ru

30

безопаснее и удобнее тем, что в случае фатальной ошибки в программе обычно достаточно просто закрыть окно с виртуальной машиной и открыть новое. При программировании же в реальной MS-DOS (не в VDM) нередко приходилось перезагружать весь компьютер или даже переустанавливать систему, впрочем, этим грешили и первые версии Windows созданные не на NT-ядре.

Перед запуском на исполнение любого файла, Windows автоматически определяет, является ли данный файл DOS-файлом или нет, и если является, то выполняет его в VDM. Windows это делает по специальному служебному заголовку исполняемого файла, — этот заголовок вставляет компилятор или транслятор в начало каждого исполняемого файла при его создании.

2.1. Какой ассемблер выбрать

Но прежде чем начать писать программы на ассемблере мы должны выбрать, какой ассемблер будем использовать. Наиболее известными и распространенными в наше время ассемблерами являются:

MASM (Macro Assembler) — ассемблер от фирмы Microsoft. Сначала MASM был коммерческим продуктом, но затем Microsoft стала распространять его в составе бесплатного DDK (Device Driver Kit — пакет разработчика драйверов), а также в составе Visual C++. Хотя Microsoft официально не объявляла MASM бесплатным продуктом, но фактически этот ассемблер в настоящее время программисты могут использовать бесплатно. MASM является основным ассемблером под Windows, т. к. большинство примеров на ассемблере, в том числе от самой Microsoft, распространяются именно на MASM. Поэтому изучать никакие другие ассемблеры под DOS/Windows в общем-то не имеет особого смысла, к тому же второй по популярности ассемблер в DOS/Windows – TASM, способен компилировать программы написанные на MASM. Microsoft продолжает совершенствовать свой продукт. Самая последняя версия MASM 8.0, включенная в состав Visual C++ 2005, имеет поддержку всех новых инструкций процессора (MMX, SSE, SSE2, SSE3, 3DNow!) и поддержку 64-

разрядного режима.

MASM32 — ассемблер созданный на основе MASM независимым программистом Стивом Хатчессоном (Steve Hutchesson или просто hutch) специально для программистов под Windows. На самом деле это тот же самый

MASM от Microsoft (MASM32 версии 10 основан на MASM версии 6.14.8444),

только в один пакет с ним включено множество библиотек облегчающих программирование, документации, примеров программ, полезных утилит, в том числе простенькое IDE (Integrated Development Environment — интегрированная среда разработки) и пр. Документация от MASM32, перевод которой существует в том числе на русском языке (можно найти на http://www.wasm.ru), является отличным введением в программирование под Windows. MASM32 совершенно бесплатен и продолжает активно развиваться. Официальный сайт, где можно скачать пакет MASM32: http://www.masm32.com.

TASM (Turbo Assembler) — ассемблер фирмы Borland, который во времена MSDOS был очень популярен. Особенностью TASM является то, что он способен работать в режиме полностью совместимом с ассемблером MASM, а также в своем собственном режиме IDEAL (использует свой синтаксис). К сожалению, фирма Borland прекратила разработку и распространение своего ассемблера.

Последняя версия транслятора TASM 5.0, поддерживает команды только до 80486 процессора включительно. Отдельно был выпушен патч, обновляющий TASM до версии 5.3 и позволяющий работать с инструкциями Pentium MMX.

Теперь TASM можно найти только в интернете или на пиратских дисках.

В интернете (например на http://www.wasm.ru) можно найти пакет TASM 5+ созданный энтузиастом по кличке !tE специально для программистов под Windows, включающий в себя кроме ассемблера TASM версии 5.3, документацию, несколько заголовочных файлов под Windows и пару демонстрационных примеров. Только не перепутайте этот пакет с TASM32 от фирмы Squak Valley Software — это совершенно независимый кроссассемблер3,

3 Кроссассемблером называют ассемблер, запускающийся на одной системе, а производящий код для другой.

http://www.sklyaroff.ru

31

ориентированный на специфические процессоры 6502, 6800/6801/68HC11, 6805, TMS32010, TMS320C25, TMS7000, 8048, 8051, 8080/8085, Z80, 8096/80C196KC.

Стоит еще упомянуть, что наш соотечественник Половников Степан создал бесплатный ассемблер для DOS и Windows под названием Lazy Assembler (http://lzasm.hotbox.ru), совместимый с режимом IDEAL TASM и

поддерживающий все современные команды процессоров: MMX, SSE, SSE2, SSE3 (PNI), SSE4 (MNI), 3DNow!Pro.

NASM (Netwide Assembler) — бесплатный переносимый ассемблер с открытым исходным кодом (open source) под лицензией GNU Lesser General Public License (LGPL). Существуют версии NASM под операционные системы DOS, Windows, Unix, OS/2 и др., а также под 32- и 64-разрядные процессоры, т. е. изучив единожды синтаксис этого языка можно не переучиваясь программировать практически под любой платформой. NASM хорошо документирован (в т. ч. можно найти переводы документации на русский язык) и продолжает совершенствоваться. Однако под Windows этот ассемблер почти не используется, т. к. исторически монополия здесь принадлежит ассемблеру MASM. К тому же многие программисты находят не очень удобным синтаксис NASM. Сайт ассемблера NASM: http://nasm.sourceforge.net.

FASM (Flat assembler) — очень популярный в последнее время ассемблер, созданный поляком Томашом Гриштаром (Tomasz Grysztar). FASM бесплатен и распространяется с исходным кодом (open source) под лицензией GNU Public Licence (GPL). На FASM были полностью написаны миниатюрные операционные системы MenuetOS и KolibriOS. Примечательно, что сам FASM был написан на себе самом. FASM имеет уникальный синтаксис с очень развитым макроязыком и поддерживает все современные инструкции 32- и 64-разрядных процессоров

(MMX, SSE, SSE2, SSE3, 3DNow!). Существуют версии FASM под операционные системы DOS, Windows, Linux и версии UNIX, которые имеют поддержку ELFформат файлов и библиотеку Си. Официальная страница FASM: http://flatassembler.net.

AS — стандартный ассемблер практически во всех разновидностях UNIX, в том числе Linux и BSD. Свободная версия этого ассемблера называется gas (GNU assembler). Синтаксис AS (GAS) в корне отличается от синтаксиса предыдущих ассемблеров.

Существует еще огромное число менее известных ассемблеров, созданных как большими фирмами, так и программистами-одиночками, например WASM, Pass32, YASM и многие другие.

Исторически в мире ассемблеров сложилось два основных типа синтаксисов: Intelсинтаксис и AT&T-синтаксис. Первый был предложен фирмой Intel и широко использовался в ассемблерах под MS-DOS. Синтаксис AT&T с самого начала стал использоваться в ассемблерах под UNIX системы.

Сейчас все существующие ассемблеры придерживаются с некоторыми оговорками либо синтаксиса Intel, либо синтаксиса AT&T. Ассемблеры MASM, MASM32, TASM, NASM, FASM используют Intel-синтаксис. Ассемблеры AS и gas используют синтаксис AT&T.

По своему опыту скажу, что если хорошо научиться программировать в Intelсинтаксисе, то перейти потом на синтаксис AT&T будет очень легко.

Мы в этой книге будем использовать только Intel-синтаксис, но в приложении 3 я привел таблицу сравнения двух синтаксисов ассемблера, с примерами кода, чтобы вы имели общее представление об AT&T-синтаксисе.

При изучении программирования под ОС MS-DOS мы будем использовать только MASM, а при изучении программирования под ОС Windows — пакет MASM32.

2.2. Этапы создания программы

Надо сразу смириться с тем, что программировать на ассемблере придется без среды программирования (IDE), столь привычной в языках высокого уровня таких как

Visual Basic, Delphi, Visual C++ и др. Правда существуют IDE и для ассемблера,

созданные независимыми разработчиками, например VisualASM, TASMED, Turbo Assembler Shell и др., но их нечасто используют программисты на ассемблере.