Программы для программирования на ассемблере
Учиться программировать начнем с процессора Intel 8086. Будем писать программы под DOS Программирование под Windows и Linux сложнее, а нам надо с чего-то начинать. Поэтому начнем с простого и понятного 16-битного процессора 8086.
Практическая ценность от программирования под DOS в наше время не очень большая, если вы, конечно, не собираетесь тесно работать с этой операционной системой. Но она позволит нам быстро освоить основы ассемблера, а потом мы уже перейдем к программированию под 32-битные системы.
Выбор компилятора
Для программирования на ассемблере нам прежде всего необходим компилятор. Наиболее известные компиляторы это TASM, MASM и FASM. В моем учебном курсе я буду использовать FASM. Это довольно новый, удобный, быстро развивающийся компилятор ассемблера, написанный на себе самом Его преимущества — это поддержка сложных макросов и мультиплатформенность. Есть версии под DOS, Windows и Linux.
С его помощью можно сгенерировать файл любого формата, не обязательно исполняемый файл, так что FASM — это превосходный инструмент для экспериментов и исследований.
Сложность в том, что сегодня большинство операционных систем даже на телефонах имеет 64-битную разрядность. В силу особенностей архитектуры просто так запустить 32-разрядную программу DOS на 64-битной системе не получится.
Эмуляция 32-битного DOS в 64-битной среде. DOSBox
Тем, кто работает в 32-битной системе Windows могут просто использовать fasm под Windows для написания и компиляции программ. В этом случае все программы учебного курса вы сможете запустить под Windows. Конечно, реально они будут работать в эмуляторе DOS, в режиме виртуального процессора 8086. Но для учебных целей это вполне подойдёт.
Ну а как же быть тем, кто идёт в ногу с цивилизацией и работает в 64-битной среде? Поскольку писать пограммы для 64 битного процессора нам еще рано, потребуется как-то эмулировать среду 32-битного DOS, к примеру, можно установить виртуальную машину, на неё поставить Windows XP 32-бит или последнюю версию MS-DOS, но предлогаю поступить проще и обойтись эмулятором DOSBox.
С оффициального сайта вы можете скачать DOSBox последней версии. Установите его, следуя инструкциям установщика и для удобства на тот же раздел диска, где находится fasm. Ярлык запуска эмулятора DOSBox появился на рабочем столе. Готово!
Ну или почти, поскольку попытка скомпилировать программу внутри fasm запущенном на DOSBox из коробки обернется неудачей. Причина в том, что DOSBox ориентирован в первую очередь на любителей ретроигр.
Редактирование dosbox.conf
Не будем огорчаться, что разработчики эмулятора обошли поддержку 32-битного реального режима (FRM mode). Мы можем получить нужный результат, перед вызовом fasm загрузив DPMI сервер. Скачайте cwsdpmi по ссылке с моего сайта. Распакуйте архив туда, куда вы ранее установили fasm. В итоге путь к CWSDPMI будет иметь вид C:\fasm\CWSDPMI.
Осталось отредактировать файл Dosbox.conf, чтобы нам не приходилось каждый раз, когда мы собираемся компилировать программу, вручную вызывать DPMI хост. В Windows 7 этот файл распологается тут: Системный раздел>:\Users\ \AppData\Local\DOSBox\dosbox-.conf.
Узнать расположение этого конфигурационного файла в своей системе вы можете по ссылке Dosbox.conf.
И так, файл Dosbox.conf открыт для редактрования, перемещаемся в самый его конец, чтобы добавить следующие строки:
А в данной статье собраны ссылки на мои материалы по ассемблеру в Linux 64 . Ассемблер это красиво, это здорово. Когда ты программируешь на ассемблере, то ощущаешь себя творцом, способным дергать за самые тонкие и скрытые ниточки операционных систем и компьютеров. Напомню, что во всех статьях я использую GNU Assembler (GAS) с синтаксисом AT&T .
Представленный список материалов об ассемблере будет динамически пополняться с появлением новых материалов.
Данные материалы будут положены в основу будущей книги по языку ассемблера GAS.
Assembler для Linux (материалы из книги)
- Ассемблер для Linux (материалы книги) . Введение
- Ассемблер для Linux (материалы книги). Параграф 1.1.
- Ассемблер для Linux (материалы книги). Параграф 1.2
- Ассемблеры платформы x86. Не большой обзор. Параграф 1.3
- Ассемблер для Linux (Первые программы для Linux на GNU Assembler) . Параграф 1.4.
- Ассемблер для Linux (материалы книги). Для начала Hello, world!Параграф 1.5.
- Язык ассемблера. Системы счисления. Параграф 1.6
- Об ассемблере. Представление чисел в компьютере. Параграф 1.7
- Завещание старых мастеров. Ассемблер. Параграф 1.8
- Ассемблер для Linux. Архитектура x86-64 для прикладного программиста. Параграф 2.1.
- GNU Assembler для Linux. Операции с ячейками памяти. Параграф 2.2.
- Ассемблер для Linux. Системные вызовы. Параграф 2.3.
- Ассемблер для Linux. Стандартный ввод-вывод. Параграф 2.4
- Числа и строки. Ассемблер. Параграф 2.5.
- Стек. Ассемблер GAS. Linux. Параграф 2.6.
- Функции в ассемблере. Параграф 2.7.
- Функции в ассемблере. Передача параметров через стек. Параграф 2.8.
- Функции в ассемблере. Передача параметров через регистры в 64-битовых системах. Параграф 2.9.
- Функции в ассемблере x86-64. Локальные переменные. Параграф 2.10 .
- Функции в ассемблере x86-64. Пример полнофункциональной программа. Параграф 2.11 .
- Функции в ассемблере x86-64. Локальные переменные. Пример рекурсивной функции. Параграф 2.12.
- Ассемблер GAS. Адресация x86-64. Параграф 3.1
- Ассемблер для Linux. Строковые операции. Параграф 3.2
- Ассемблер x86-64 GAS. Условные конструкции Параграф 3.3
- GNU assembler. Условные конструкции. Параграф 3.4 .
- Ассемблер GAS, x86-64 Linux. Стандартные арифметические команды. Параграф 3.5
- Ассемблер GAS, x86-64. Битовые и логические операции (книга) Параграф 3.6
- Ассемблер GAS, x86-64. Команды для работы с числами с плавающей точкой (книга) Параграф 3.7
- Ассемблер GAS, x86-64. Примеры с числами с плавающей точкой (книга) Параграф 3.8
- Ассемблер x86-64, GAS. Расширения процессора (книга). Параграф 3.9
- Ассемблер x86-64, GAS. Открытие файла, чтение из файла (книга) Параграф 4.1
- Ассемблер x86-64, GAS. Запись в файл, копирование (книга). Параграф 4.2
- Ассемблер GAS (x86-64). Текстовые файлы (книга). Параграф 4.3
- Ассемблер GAS (x86-64). Перемещение внутри файла (книга). Параграф 4.4
- Ассемблер GAS , x86-64, Linux. Программное изменение режимов доступа к файлам и папкам (книга) Параграф 4.5
- Ассемблер для Linux. Удаление и переименование файлов (книга) Параграф 4.6
- Ассемблер для Windows. Создание и удаление каталогов (книга) Параграф 4.7
- Ассемблер для Linux. Параметры командной строки (книга) Параграф 4.8
- Ассемблер для Linux. Пример с параметром в командной строке (книга) Параграф 4.9
- Ассемблер для Linux (GAS). Программа чтения содержимого каталога (книга)
- Программирование на GAS в Linux x86-64. Объектные модули и их объединение(книга)
- Программирование на языке ассемблера в Linux 64. Компилирование с помощью программы gcc (книга)
- Ассемблер GAS. Использование стандартных библиотечных функций C и доступ к параметрам командной строки (книга)
- Программирование на ассемблере GAS в Linux x86-64. Создание статических библиотек (книга)
- Программирование на ассемблере Ассемблер GAS в Linux x86-64. Использование ассемблерного кода в языках высокого уровня (книга)
- Программирование на ассемблере GAS в Linux x86-64. Создание динамических библиотек (книга)
- Программирование на ассемблере GAS. Использование кода на высокоуровневых языках в программе на языке ассемблера (книга)
- Программирование на ассемблере GAS Linux x86-64. Запуск процессов (книга)
- Программирование на ассемблере GAS Linux x86-64. Создание процессов, функция fork (книга)
- Программирование на GNU assembler Linux x86-64. Ожидание конца работы дочернего процесса, wait (книга)
- Программирование на GNU ассемблере Linux x86-64. Получение списка строк окружения процесса (книга)
- Программирование на ассемблере в Linux. Взаимодействие процессов. Разделяемая память (книга)
- Программирование на ассемблере в Linux. Использование pipe для взаимодействия процессов (книга)
- Программирование на ассемблере в Linux. Семафоры (книга)
Мои ресурсы на канале по языку ассемблер для Linux (GNU assembler x86-64)
- Из записок старого программиста. Завещание старых мастеров. Ассемблер
- Ассемблер на платформе x86-64, Linux, программирование. Статья 1 (регистры, syscall)
- Программирование на ассемблере для Linux (консольный ввод-вывод). Статья 2
- Программирование на ассемблере (преобразование целого числа в строку). Статья 3
- Программирование на ассемблере (преобразование строки в число). Статья 4
- Программирование на ассемблере (стек). Статья 5
- Программирование на ассемблере (стек, подпрограмма, передача параметров). Статья 6
- Программирование на ассемблере (передача параметров в 64-х битовых системах). Статья 7
- Зачем нужно изучать ассемблер (assembler forever)
- Программирование на ассемблере. Статья 8 (объединение объектных модулей)
- Программирование на ассемблере. Статья 9 (ассемблер и C)
- Программирование на ассемблере. Статья 10 (ассемблер и C)
- Программирование на ассемблере. Статья 11 (ассемблер и C)
- Программирование на ассемблере. Статья 12 (ассемблер и C)
- Программирование на ассемблере. Статья 13 (адресация)
- Программирование на ассемблере. Статья 14 (адресация с масштабированием)
- Ассемблер и C, пример эксперимента по сравнению производительности
- Язык C. Функция с переменным числом параметров
- Язык C. Функция с переменным числом параметров. Вариант решения
- Ассемблерный код программ на языке C (интрига продолжается)
- Ассемблерный код программ на языке C (интрига близка к завершению)
- Ассемблер и C (конец интриги)
- Из записок старого программиста Воспоминания об ассемблере
- Ассемблер vs ассемблер (интрига не закончилась)
- О языке программирования ассемблер на платформе x86-64. Самое начало
- Ассемблер. Управление файлами. Статья 1
- Ассемблер. Управление файлами. Статья 2
- Ассемблер, управление файлами. Статья 3
- Ассемблер. Числа с плавающей точкой
- Ассемблер. Числа с плавающей точкой. Еще один пример
- Из записок старого программиста. Воспоминания об ассемблере 2
- Ассемблер. Создаем статические библиотеки
- Ассемблер. Создаем динамические библиотеки в Linux
- Из записок старого программиста. Воспоминания об ассемблере 3
- Ассемблер. Доступ к параметрам командной строки
- Ассемблер. Доступ к параметрам командной строки. Статья 2
- Ассемблер на платформе Linux x86-64. Получить параметр командной строки. Статья 3
- Программирование на ассемблере as в Linux. Системный вызов execve
- Linux GNU assembler. Программа для запуска других процессов из командной строки
- Программирование на языке ассемблера в Linux. Получить список строк окружения (environment)
- И снова ассемблер (GAS x86-64) для Linux. Продолжаем работать со стеком, локальные переменные
- GNU assembler x86-64 Linux. Стек и команды ассемблера
- Ассемблер, команды ассемблера, основные конструкции (assembler x86-64)
- Ассемблер для Linux. Локальные переменные (продолжение)
- Сложные логические условия на ассемблере (GNU assembler, Linux, x86-64)
- Программирование на ассемблере в Linux. Вложенные циклы
- Ассемблер x86-64. Строковые операции
- Ассемблеры. Не большой обзор
- Ассемблер x86-64. Базовые арифметические операции
- Ассемблер x84-64. Регистр флагов (флаги условий)
- Ассемблер x86-64. Строковые команды (movs , lods , stos , cmps , scas)
- Ассемблер x86-64. Битовые и логические операции
- Книга "Ассемблер для Linux"
Пока. Подписываемся на мой канал Old Programmer и программируем на ассемблере.
Статья посвящена языку ассемблер с учетом актуальных реалий. Представлены преимущества и отличия от ЯВУ, произведено небольшое сравнение компиляторов, скрупулёзно собрано значительное количество лучшей тематической литературы.
1. Язык. Преимущества и отличия от ЯВУ
Ассемблер (Assembly) — язык программирования, понятия которого отражают архитектуру электронно-вычислительной машины. Язык ассемблера — символьная форма записи машинного кода, использование которого упрощает написание машинных программ. Для одной и той же ЭВМ могут быть разработаны разные языки ассемблера. В отличие от языков высокого уровня абстракции, в котором многие проблемы реализации алгоритмов скрыты от разработчиков, язык ассемблера тесно связан с системой команд микропроцессора. Для идеального микропроцессора, у которого система команд точно соответствует языку программирования, ассемблер вырабатывает по одному машинному коду на каждый оператор языка. На практике для реальных микропроцессоров может потребоваться несколько машинных команд для реализации одного оператора языка.
Язык ассемблера обеспечивает доступ к регистрам, указание методов адресации и описание операций в терминах команд процессора. Язык ассемблера может содержать средства более высокого уровня абстракции: встроенные и определяемые макрокоманды, соответствующие нескольким машинным командам, автоматический выбор команды в зависимости от типов операндов, средства описания структур данных. Главное достоинство языка ассемблера — «приближенность» к процессору, который является основой используемого программистом компьютера, а главным неудобством — слишком мелкое деление типовых операций, которое большинством пользователей воспринимается с трудом. Однако язык ассемблера в значительно большей степени отражает само функционирование компьютера, чем все остальные языки.
И хотя драйвера и операционные системы сейчас пишут на Си, но Си при всех его достоинствах — язык высокого уровня абстракции, скрывающий от программиста различные тонкости и нюансы железа, а ассемблер — язык низкого уровня абстракции, прямо отражающий все эти тонкости и нюансы.
Для успешного использования ассемблера необходимы сразу три вещи:
- знание синтаксиса транслятора ассемблера, который используется (например, синтаксис MASM, FASM и GAS отличается), назначение директив языка ассемблер (операторов, обрабатываемых транслятором во время трансляции исходного текста программы);
- понимание машинных инструкций, выполняемых процессором во время работы программы;
- умение работать с сервисами, предоставляемыми операционной системой — в данном случае это означает знание функций Win32 API. При работе с языками высокого уровня очень часто к API системы программист прямо не обращается; он может даже не подозревать о его существовании, поскольку библиотека языка скрывает от программиста детали, зависящие от конкретной системы. Например, и в Linux, и в Windows, и в любой другой системе в программе на Си/Си++ можно вывести строку на консоль, используя функцию printf() или поток cout, то есть для программиста, использующего эти средства, нет разницы, под какую систему делается программа, хотя реализация этих функций будет разной в разных системах, потому что API систем очень сильно различается. Но если человек пишет на ассемблере, он уже не имеет готовых функций типа printf(), в которых за него продумано, как «общаться» с системой, и должен делать это сам.
Оптимальной можно считать программу, которая работает правильно, по возможности быстро и занимает, возможно, малый объем памяти. Кроме того, ее легко читать и понимать; ее легко изменить; ее создание требует мало времени и незначительных расходов. В идеале язык ассемблера должен обладать совокупностью характеристик, которые бы позволяли получать программы, удовлетворяющие как можно большему числу перечисленных качеств.
На языке ассемблера пишут программы или их фрагменты в тех случаях, когда критически важны:
- объем используемой памяти (программы-загрузчики, встраиваемое программное обеспечение, программы для микроконтроллеров и процессоров с ограниченными ресурсами, вирусы, программные защиты и т.п.);
- быстродействие (программы, написанные на языке ассемблера выполняются гораздо быстрее, чем программы-аналоги, написанные на языках программирования высокого уровня абстракции. В данном случае быстродействие зависит от понимания того, как работает конкретная модель процессора, реальный конвейер на процессоре, размер кэша, тонкостей работы операционной системы. В результате, программа начинает работать быстрее, но теряет переносимость и универсальность).
Языки программирования высокого уровня абстракции разрабатывались с целью возможно большего приближения способа записи программ к привычным для пользователей компьютеров тех или иных форм записи, в частности математических выражений, а также чтобы не учитывать в программах специфические технические особенности отдельных компьютеров. Язык ассемблера разрабатывается с учетом специфики процессора, поэтому для грамотного написания программы на языке ассемблера требуется, в общем, знать архитектуру процессора используемого компьютера. Однако, имея в виду преимущественное распространение PC-совместимых персональных компьютеров и готовые пакеты программного обеспечения для них, об этом можно не задумываться, поскольку подобные заботы берут на себя фирмы-разработчики специализированного и универсального программного обеспечения.
2. О компиляторах
Какой ассемблер лучше?
Для процессора x86-x64, имеется более десятка различных ассемблер компиляторов. Они отличаются различными наборами функций и синтаксисом. Некоторые компиляторы больше подходят для начинающих, некоторые ― для опытных программистов. Некоторые компиляторы достаточно хорошо документированы, другие вообще не имеют документации. Для некоторых компиляторов разработано множеством примеров программирования. Для некоторых ассемблеров написаны учебные пособия и книги, в которых подробно рассматривается синтаксис, у других нет ничего. Какой ассемблер лучше?
Учитывая множество диалектов ассемблеров для x86-x64 и ограниченное количество времени для их изучения, ограничимся кратким обзором следующих компиляторов: MASM, TASM, NASM, FASM, GoASM, Gas, RosAsm, HLA.
Какую операционную систему вы бы хотели использовать?
Это вопрос, на который вы должны ответить в первую очередь. Самый многофункциональный ассемблер не принесет вам никакой пользы, если он не предназначен для работы под ту операционную систему, которую вы планируете использовать.
Windows | DOS | Linux | BSD | QNX | MacOS, работающий на процессоре Intel/AMD | |
---|---|---|---|---|---|---|
FASM | x | x | x | x | ||
GAS | x | x | x | x | x | x |
GoAsm | x | |||||
HLA | x | x | ||||
MASM | x | x | ||||
NASM | x | x | x | x | x | x |
RosAsm | x | |||||
TASM | x | x |
Поддержка 16 бит
Если ассемблер поддерживает DOS, то он поддерживает и 16-разрядные команды. Все ассемблеры предоставляют возможность писать код, который использует 16-разрядные операнды. 16-разрядная поддержка означает возможность создания кода, работающего в 16-разрядной сегментированной модели памяти (по сравнению с 32-разрядной моделью с плоской памятью, используемой большинством современных операционных систем).
Поддержка 64 бит
За исключением TASM, к которому фирма Borland охладела в середине нулевых, и, который не поддерживает в полном объеме даже 32-разрядные программы, все остальные диалекты поддерживают разработку 64-разрядных приложений.
Переносимость программ
Очевидно, что вы не собираетесь писать код на ассемблере x86-x64, который запускался бы на каком-то другом процессоре. Однако, даже на одном процессоре вы можете столкнуться с проблемами переносимости. Например, если вы предполагаете компилировать и использовать свои программы на ассемблере под разными операционными системами. NASM и FASM можно использовать в тех операционных системах, которые они поддерживают.
Предполагаете ли вы писать приложение на ассемблере и затем портировать, это приложение с одной ОС на другую с «перекомпиляцией» исходного кода? Эту функцию поддерживает диалект HLA. Предполагаете ли вы иметь возможность создавать приложения Windows и Linux на ассемблере с минимальными усилиями для этого? Хотя, если вы работаете с одной операционной системой и абсолютно не планируете работать в какой-либо другой ОС, тогда эта проблема вас не касается.
Поддержка высокоуровневых языковых конструкций
Некоторые ассемблеры предоставляют расширенный синтаксис, который обеспечивает языковые высокоуровневые структуры управления (типа IF, WHILE, FOR и так далее). Такие конструкции могут облегчить обучение ассемблеру и помогают написать более читаемый код. В некоторые ассемблеры встроены «высокоуровневые конструкции» с ограниченными возможностями. Другие предоставляют высокоуровневые конструкции на уровне макросов.
Никакой ассемблер не заставляет вас использовать какие-либо структуры управления или типы данных высокого уровня, если вы предпочитаете работать на уровне кодировки машинных команд. Высокоуровневые конструкции ― это расширение базового машинного языка, которое вы можете использовать, если найдете их удобными.
Качество документации
Удобство использования ассемблера напрямую связано с качеством его документации. Учитывая объем работы, который тратится для создания диалекта ассемблера, созданием документации для этого диалекта авторы компиляторов практически не заморачиваются. Авторы, расширяя свой язык, забывают документировать эти расширения.
В следующей таблице описывается качество справочного руководства ассемблера, которое прилагается к продукту:
Учебники и учебные материалы
Документация на самом ассемблере, конечно, очень важна. Еще больший интерес для новичков и других, изучающих язык ассемблера (или дополнительные возможности данного ассемблера), ― это наличие документации за пределами справочного руководства для языка. Большинство людей хотят, чтобы учебник, объясняющий, как программировать на ассемблере, не просто предоставляет синтаксис машинных инструкций и ожидает, что читателю объяснят, как объединять эти инструкции для решения реальных проблем.
MASM является лидером среди огромного объема книг, описывающих, как программировать на этом диалекте. Есть десятки книг, которые используют MASM в качестве своего ассемблера для обучения ассемблеру.
Большинство учебников по ассемблеру MASM/TASM продолжают обучать программированию под MS-DOS. Хотя постепенно появляются учебники, которые обучают программированию в Windows и Linux.
3. Литература и веб ресурсы
Beginners
Advanced
4. Практика
Итак, вы уже знаете, что такое ассемблер и с чем его едят. Вы запаслись парой/тройкой книг и веб мануалами, возможно определились и с компилятором… К сожалению уроки программирования выходят за рамки данной статьи, но для тех чей выбор пал на MASM/FASM можете воспользоваться следующими макетами:
- MASM64 простое окно masm64SimpleWindow.asm
- FASM64 простое окно fasm64SimpleWindow.asm
Так получилось, что среда не полностью бесплатная. Вы можете поддержать проект приобретая Pro лицензию за свободную стоимость. Используйте код: HABR_zzdBG1qadG (если бесплатно установите бегунок в позицию 0).
Желаем вам, друзья, значительных достижений и новых знаний в 2018 году!
Ps1: Уважаемый, Хабрахабр! Добавьте в ваш редактор подсветку ассемблера (Intel-синтаксис), это пригодится для будущих статей!
В данной статье я хочу рассмотреть вопросы, которые могут возникнуть у человека, приступившего к изучению ассемблера, связанные с установкой различных трансляторов и трансляцией программ под Windows и Linux, а также указать ссылки на ресурсы и книги, посвященные изучению данной темы.
Используется для создания драйверов под Windows.
По ссылке переходим на сайт и скачиваем пакет (masm32v11r.zip). После инсталляции программы на диске создается папка с нашим пакетом C:\masm32. Создадим программу prog11.asm, которая ничего не делает.
Произведём ассемблирование (трансляцию) файла prog11.asm, используя ассемблер с сайта masm32.
Ключ /coff используется здесь для трансляции 32-битных программ.
Линковка производится командой link /subsystem:windows prog11.obj (link /subsystem:console prog11.obj)
Как сказано в Википедии
MASM — один из немногих инструментов разработки Microsoft, для которых не было отдельных 16- и 32-битных версий.
Кстати, вот ссылка на личный сайт Владислава Пирогова, автора книги “Ассемблер для Windows”.
MASM с сайта Microsoft
Открываем этот файл архиватором (например 7zip). Внутри видим файл setup.exe, извлекаем его, открываем архиватором. Внутри видим два файла vc_masm.msi,vc_masm1.cab. Извлекаем файл vc_masm1.cab, открываем архиватором. Внутри видим файл FL_ml_exe_____X86.3643236F_FC70_11D3_A536_0090278A1BB8. Переименовываем его в файл fl_ml.exe, далее, произведём ассемблирование файла prog11.asm, используя ассемблер fl_ml.exe.
MASM в Visual Studio
Также MASM можно найти в папке с Visual Studio (у меня VS 10) вот здесь: C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\ml.exe.
Для того, чтобы запустить на 32- или 64-разрядной системе и создавать программы, работающие как под 32-, так и под 64-разрядной Windows, подходит MASM32 (ml.exe, fl_ml.exe). Для того, чтобы работать на 32- и 64-разрядных системах и создавать программы, работающие под 64-разрядной Windows, но неработающие под 32-разрядной нужен ассемблер ml64.exe. Лежит в папке C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\amd64 и вот здесь — C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\x86_amd64.
Программный пакет компании Borland, предназначенный для разработки программ на языке ассемблера для архитектуры x86. В настоящее время Borland прекратила распространение своего ассемблера.
Выполним ассемблирование (трансляцию) файла abel32.asm.
Корректность работы программы можно проверить, произведя линковку (tlink.exe) объектного файла и запустив полученный файл в отладчике.
Как было сказано выше, MASM можно использовать для работы с 16-битными программами. Выполним ассемблирование (трансляцию) программы abel32.asm с помощью ассемблера MASM:
Ключ /coff здесь не используется.
Линковка производится файлом link16.exe
Вот здесь приводится порядок действий, которые необходимо выполнить для запуска TASM в DOSbox. Для линковки понадобится файл DPMI16BI.OVL
В статье Криса Касперски «Сравнение ассемблерных трансляторов» написано, что «FASM — неординарный и весьма самобытный, но увы, игрушечный ассемблер. Пригоден для мелких задач типа „hello, world“, вирусов, демок и прочих произведений хакерского творчества.»
Скачаем FASM с официального сайта. Инсталлятора нет, просто извлекаем программу. Откроем fasm editor — C:\fasm\fasmw.exe. В папке C:\fasm\EXAMPLES\HELLO есть файл HELLO.asm.
Откроем файл HELLO.asm из fasmw.exe. Изменим строку include 'win32ax.inc' на строку include 'c:\fasm\INCLUDE\WIN32AX.INC'. Запускаем из меню Run → Run.
Вот ссылки на ресурсы, посвященные FASM:
FASM в Linux
Для того, использовать FASM в Linux (у меня Ubuntu), скачаем соответствующий дистрибутив (fasm-1.71.60.tgz), распакуем его, в папке у нас будет бинарный файл fasm, копируем этот файл в /usr/local/bin для того, чтобы можно было запускать его из консоли, как любую другую команду.Выполним ассемблирование программы hello.asm из папки fasm/examples/elfexe/hello.asm.
Корректность работы программы можно проверить в отладчике.
Nasm успешно конкурирует со стандартным в Linux- и многих других UNIX-системах ассемблером Gas.
Nasm в Linux можно установить с помощью менеджера пакетов или из командной строки: в дистрибутиве Debian (Ubuntu) командой apt-get install nasm, в дистрибутивах Fedora, CentOS, RedHat командой yum install nasm.
Выполним ассемблирование и линковку и запустим файл hello.asm.
Для 64bit необходимо использовать команду nasm -f elf64 hello.asm
NASM для Windows
NASM для Windows можно установить, скачав соответствующий дистрибутив с соответствующего сайта.
Ссылки на ресурсы, посвященные Nasm:
Стандартный ассемблер практически во всех разновидностях UNIX, в том числе Linux и BSD. Свободная версия этого ассемблера называется GAS (GNU assembler). Позволяет транслировать программы с помощью компилятора GCC.
Из учебников удалось найти только книгу на английском «Programming from the ground up». На русском удалось найти только одну главу из книги С. Зубкова «Assembler для DOS, Windows и UNIX».
Возьмем пример программы, которая ничего не делает, с сайта. Создадим программу gas.s
Выполним ассемблирование (трансляцию), линковку и запуск программы:
Если в данной программе изменить _start на main, то можно выполнить ассемблирование (трансляцию) и линковку компилятором gcc.
Выполним ассемблирование (трансляцию), линковку и запуск программы:
Выводы: если вы изучаете программирование под Windows, то вы можете остановить свой выбор на Masm; Tasm больше не поддерживается, но для обучения по старым классическим учебникам подойдёт.
Под Linux Gas подойдет тем, кто использует GCC, а тем, кому не нравится синтаксис Gas, подойдёт Nasm.
P.S. Про обработку строк в ассемблере на примере создания транслятора простого «эзотерического» языка можно прочитать здесь.
P.P.S. Упрощенный ограниченный набор ассемблерных инструкций используется в учебной модели компьютера Little Man Computer, которому у меня также посвящено несколько статей ссылка.
Многие считают, что Assembler – уже устаревший и нигде не используемый язык, однако в основном это молодые люди, которые не занимаются профессионально системным программированием. Разработка ПО, конечно, хорошо, но в отличие от высокоуровневых языков программирования, Ассемблер научит глубоко понимать работу компьютера, оптимизировать работку с аппаратными ресурсами, а также программировать любую технику, тем самым развиваясь в направлении машинного обучения. Для понимания этого древнего ЯП, для начала стоит попрактиковаться с простыми программами, которые лучше всего объясняют функционал Ассемблера.
IDE для Assembler
Перед работой главное не забыть дописать в системную переменную PATH строчку:
Программа «Hello world» на ассемблере
Считается, что это базовая программа в программировании, которую начинающие при знакомстве с языком пишут в первую очередь. Возможно, такой подход не совсем верен, но так или иначе позволяет сразу же увидеть наглядный результат:
Для начала запускаем редактор qeditor.exe в папке с установленной MASM32, и в нём пишем код программы. После сохраняем его в виде файла с расширением «.asm», и билдим программу с помощью пункта меню «Project» → «Build all». Если в коде нет ошибок, программа успешно скомпилируется, и на выходе мы получим готовый exe-файл, который покажет окно Windows с надписью «Hello world».
Сложение двух чисел на assembler
Здесь мы используем так называемые метки и специальные команды с их использованием (jz, jmp, test). Разберём подробнее:
- test – используется для логического сравнения переменных (операндов) в виде байтов, слов, или двойных слов. Для сравнения команда использует логическое умножение, и смотрит на биты: если они равны 1, то и бит результата будет равен 1, в противном случае – 0. Если мы получили 0, ставятся флаги совместно с ZF (zero flag), которые будут равны 1. Далее результаты анализируются на основе ZF.
- jnz – в случае, если флаг ZF нигде не был поставлен, производится переход по данной метке. Зачастую эта команда применяется, если в программе есть операции сравнения, которые как-либо влияют на результат ZF. К таким как раз и относятся test и cmp.
- jz – если флаг ZF всё же был установлен, выполняется переход по метке.
- jmp – независимо от того, есть ZF, или же нет, производится переход по метке.
Программа суммы чисел на ассемблере
Примитивная программа, которая показывает процесс суммирования двух переменных:
В Ассемблере для того, чтобы вычислить сумму, потребуется провести немало действий, потому как язык программирования работает напрямую с системной памятью. Здесь мы по большей частью манипулируем ресурсами, и самостоятельно указываем, сколько выделить под переменную, в каком виде воспринимать числа, и куда их девать.
Получение значения из командной строки на ассемблере
Одно из важных основных действий в программировании – это получить данные из консоли для их дальнейшей обработки. В данном случае мы их получаем из командной строки и выводим в окне Windows:
Также можно воспользоваться альтернативным методом:
Здесь используется invoke – специальный макрос, с помощью которого упрощается код программы. Во время компиляции макрос-команды преобразовываются в команды Ассемблера. Так или иначе, мы пользуемся стеком – примитивным способом хранения данных, но в тоже время очень удобным. По соглашению stdcall, во всех WinAPI-функциях переменные передаются через стек, только в обратном порядке, и помещаются в соответствующий регистр eax.
Циклы в ассемблере
Для создания цикла используется команда repeat. Далее с помощью inc увеличивается значение переменной на 1, независимо от того, находится она в оперативной памяти, или же в самом процессоре. Для того, чтобы прервать работу цикла, используется директива «.BREAK». Она может как останавливать цикл, так и продолжать его действие после «паузы». Также можно прервать выполнение кода программы и проверить условие repeat и while с помощью директивы «.CONTINUE».
Сумма элементов массива на assembler
Здесь мы суммируем значения переменных в массиве, используя цикл «for»:
Команда dec, как и inc, меняет значение операнда на единицу, только в противоположную сторону, на -1. А вот cmp сравнивает переменные методом вычитания: отнимает одно значение из второго, и, в зависимости от результата ставит соответствующие флаги.
С помощью команды jne выполняется переход по метке, основываясь на результате сравнения переменных. Если он отрицательный – происходит переход, а если операнды не равняются друг другу, переход не осуществляется.
Ассемблер интересен своим представлением переменных, что позволяет делать с ними что угодно. Специалист, который разобрался во всех тонкостях данного языка программирования, владеет действительно ценными знаниями, которые имеют множество путей использования. Одна задачка может решаться самыми разными способами, поэтому путь будет тернист, но не менее увлекательным.
Читайте также: