FASM Editor 1.0
Автор: xrnd | Рубрика: Инструменты | 02-07-2011
FASM Editor — замечательная среда разработки для FASM. Программа довольно простая, но в ней есть всё, что нужно для удобного написания программ на ассемблере.
Учебный курс. Часть 31. Сегментная адресация
Автор: xrnd | Рубрика: Учебный курс | 14-04-2011
До этой части учебного курса мы создавали только COM-программы, в которых один и тот же сегмент использовался для кода, данных и стека. Однако, для дальнейшего изложения необходимо подробнее разобраться с сегментной адресацией.
Формирование адреса в реальном режиме
Основная идея сегментной адресации в том, что адрес состоит из двух частей — сегментной и смещения. Обычно их записывают через двоеточие (например 0100:0500). Линейный адрес любой ячейки памяти получается в результате сложения смещения и сегментной части, сдвинутой на 4 бита влево.

Начало сегмента всегда выровнено на границу параграфа (адрес кратен 16 байтам). Максимальный размер сегмента равен 216 = 64 КБайта. А всего можно адресовать 220 = 1 МБайт памяти. Конечно, сейчас такой объем памяти кажется смешным, но раньше это было очень много
Преобразование 64-битного числа в строку
Автор: xrnd | Рубрика: Исходники | 27-12-2010
В части 22 учебного курса рассматривались способы преобразования чисел в строку. Однако, вывести в десятичном виде число больше 32 бит не так просто. Сложность в том, что требуется делить число на 10, а число слишком большое и в регистры DX:AX не помещается.
К счастью, в программе на ассемблере можно делить числа любой разрядности
Правда, одной командой DIV тут не обойтись. Придётся реализовать специальный алгоритм.
Работа с файлами в DOS
Автор: xrnd | Рубрика: Исходники | 25-12-2010
Эта статья лишь небольшой пример того, как можно работать с файлами, используя функции DOS. Я не буду описывать все возможные значения параметров и вдаваться в подробности. Это вы можете найти самостоятельно в справочнике.
Первая программа будет создавать файл и записывать в него данные. Вторая программа — открывать файл, читать данные и выводить их на консоль.
Создание нового файла
Прежде, чем что-то записывать, необходимо создать файл. Для этого используется функция DOS 3Ch.

Учебный курс. Часть 30. Команды работы с битами
Автор: xrnd | Рубрика: Учебный курс | 13-12-2010
Работать с отдельными битами операндов можно, используя логические операции и сдвиги. Однако, кроме них в системе команд x86 существуют специальные команды для работы с битами: это команды сканирования битов и команды проверки (и модификации) битов. Впервые они появились в процессоре i386. Так что сейчас вы вряд ли найдёте процессор, в котором их нет.
Команды сканирования битов
Сканирование битов выполняется командами BSF и BSR. Эти команды очень похожи. У них 2 операнда. Первый операнд должен быть 16-битным регистром, в него записывается результат. Второй операнд может быть 16-битным регистром или словом в памяти — это обрабатываемое значение.
Команда BSF просматривает биты второго операнда от младшего к старшему и помещает индекс первого единичного бита в регистр. Биты нумеруются, начиная с нуля. Если единичный бит найден, то флаг нуля сбрасывается (ZF=0). Если все биты нулевые, то флаг нуля устанавливается (ZF=1), а значение первого операнда будет неопределённым (на разных процессорах может быть по-разному). Например, мой процессор (Athlon XP) в этом случае не изменяет значение в регистре. Пример кода:
mov ax,01011000b ;AX=58h bsf bx,ax ;BX=3, ZF=0 xor ax,ax ;AX=0 bsf bx,ax ;BX=?, ZF=1
Учебный курс. Часть 29. Макросы PROC и ENDP
Автор: xrnd | Рубрика: Учебный курс | 06-12-2010
Наверно, вы заметили, что довольно неудобно обращаться к параметрам и локальным переменным, указывая смещения относительно регистра BP. Такой способ подходит только для совсем простых и маленьких процедур. Поэтому в таких ассемблерах, как TASM и MASM, существуют специальные директивы, позволяющие создавать процедуры быстро и удобно. В FASM таких директив нет! Но они и не нужны — то же самое можно сделать с помощью макросов.
Для начала, нам потребуется заголовочный файл с макросами. Стандартный пакет FASM для Windows, к сожалению, не включает в себя макросы для 16-битных процедур. Однако такие макросы можно найти на официальном форуме FASM или скачать здесь: PROC16.INC. Это переделанная версия файла PROC32.INC с точно таким же синтаксисом.
Заголовочный файл необходимо будет включить в программу с помощью директивы include:
1 | include 'proc16.inc' |
Базовый синтаксис объявления процедуры
Для создания процедуры используется следующий синтаксис:
proc < имя_процедуры>[,][< список_параметров>] ... ret endp
Учебный курс. Часть 28. Основы создания макросов
Автор: xrnd | Рубрика: Учебный курс | 16-11-2010
Отличительной особенность FASM является очень гибкая и мощная поддержка макросов. В этой статье мы рассмотрим лишь основы создания макросов, так как эта тема довольно обширна и рассказать всё в одной статье не получится.
Что же такое макросы? Макросы — это шаблоны для генерации кода. Один раз создав макрос, мы можем использовать его во многих местах в коде программы. Макросы делают процесс программирования на ассемблере более приятным и простым, а код программы получается понятнее. Макросы позволяют расширять синтаксис ассемблера и даже добавлять собственные «команды», которых нет в процессоре.
Обработкой макросов занимается препроцессор FASM. Преобразование исходного кода в исполняемый код FASM выполняет в два этапа. Первый этап — препроцессирование, а второй — собственно ассемблирование или компиляция. На первом этапе происходит вычисление всех числовых выражений, вместо констант и названий меток подставляются их фактические значения, вместо макросов подставляется сгенерированный код. На втором этапе все данные и машинные команды преобразуются в соответствующие байты, и в результате получается исполняемый файл требуемого формата.
Синтаксис создания макроса
Для создания макроса используется директива macro. Эта директива имеет следующий синтаксис:
macro < название_макроса> [< список_параметров>] { < тело_макроса> }
Учебный курс. Часть 27. Синтаксис объявления меток
Автор: xrnd | Рубрика: Учебный курс | 03-11-2010
Не сомневаюсь, что объявлять метки вы уже научились
Однако, синтаксис FASM не ограничивается объявлением простых меток. В этой части мы рассмотрим дополнительную директиву для создания меток, а также научимся использовать локальные и анонимные метки.
В синтаксисе FASM существует 3 основных способа объявления меток:
1. Имя метки, после которого ставится двоеточие. Это самый простой способ. Обычно так объявляются метки в коде. (Подробнее об этом способе читайте в части 13 учебного курса)
exit_app: mov ax,4C00h int 21h
2. Использование директив объявления данных. Имя переменной является по сути той же меткой. Отличие от первого способа в том, что дополнительно с именем метки связывается размер переменной. (Подробнее читайте в части 5 учебного курса)
x db 5 y dw 34,1200,? z rd 1
Создание листинга в FASM
Автор: xrnd | Рубрика: Учебный курс | 28-10-2010
Файл листинга — это очень полезная вещь. Он позволяет увидеть работу компилятора FASM как на ладони: что генерирует каждая строка исходного кода, сколько байт занимают машинные команды, какие значения присваиваются переменным. Листинг может помочь при отладке сложных программ. Также он пригодится начинающим изучать ассемблер.
Сначала необходимо скомпилировать программу — генератор листинга, которая поставляется вместе с FASM. Сделать это очень просто. Нужно открыть файл C:\FASM\TOOLS\WIN32\LISTING.ASM (у меня FASM находится в папке C:\FASM, у вас может быть по-другому) и скомпилировать его (пункт меню Run->Compile). Полученный исполняемый файл (LISTING.EXE) можно для удобства поместить в папку C:\FASM.
Если запустить этот файл из командной строки, то он сообщит способ своего использования:



