Автор: xrnd | Рубрика: Новости | 05-12-2012
Приветствую всех читателей сайта «asmworld.ru»!
Грустно об этом сообщать, но в последнее время я совсем забросил написание статей и разбор комментариев. Много работы, да и других дел тоже хватает. Сейчас я занимаюсь очень интересными проектами. Пишу на ассемблере для AVR и PIC. Кроме того занимаюсь электроникой и пишу на C++ для компьютера. Паяю то, что не удаётся запрограммировать, и программирую то, что не удалось спаять. Пока не знаю, когда продолжу написание своего учебника и продолжу ли вообще.
Многие из вас мне пишут слова благодарности, и я очень рад, что мои статьи приносят кому-то пользу. Спасибо вам за добрые слова 🙂
Сайт не пропадёт и никуда не денется. Я за ним слежу, оплачиваю хостинг и домен. Так что заходите и читайте в любое время.
Предупреждаю, что ваши комментарии не появятся на сайте сразу после добавления! Приходит очень много мерзкого спама, фильтруется он плоховато, поэтому я проверяю комментарии вручную. Постараюсь делать это почаще, а то я тут обнаружил целую кучу непроверенных комментариев.
А вот рекламы на сайте больше нет. Денег от неё копейки, поэтому я её выпилил.
Желаю всем удачи и творческих успехов!
Автор: xrnd | Рубрика: Инструменты | 07-09-2011
Вышла вторая версия среды разработки FASM Editor!

Скачать FASM Editor 2.0
Автор: xrnd | Рубрика: Инструменты | 02-07-2011
FASM Editor — замечательная среда разработки для FASM. Программа довольно простая, но в ней есть всё, что нужно для удобного написания программ на ассемблере.

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

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

Читать полностью »
Автор: 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 |
mov ax,01011000b ;AX=58h
bsf bx,ax ;BX=3, ZF=0
xor ax,ax ;AX=0
bsf bx,ax ;BX=?, ZF=1
Читать полностью »
Автор: xrnd | Рубрика: Учебный курс | 06-12-2010
Наверно, вы заметили, что довольно неудобно обращаться к параметрам и локальным переменным, указывая смещения относительно регистра BP. Такой способ подходит только для совсем простых и маленьких процедур. Поэтому в таких ассемблерах, как TASM и MASM, существуют специальные директивы, позволяющие создавать процедуры быстро и удобно. В FASM таких директив нет! Но они и не нужны — то же самое можно сделать с помощью макросов.
Для начала, нам потребуется заголовочный файл с макросами. Стандартный пакет FASM для Windows, к сожалению, не включает в себя макросы для 16-битных процедур. Однако такие макросы можно найти на официальном форуме FASM или скачать здесь: PROC16.INC. Это переделанная версия файла PROC32.INC с точно таким же синтаксисом.
Заголовочный файл необходимо будет включить в программу с помощью директивы include:
Базовый синтаксис объявления процедуры
Для создания процедуры используется следующий синтаксис:
proc < имя_процедуры>[,][< список_параметров>]
...
ret
endp |
proc < имя_процедуры>[,][< список_параметров>]
...
ret
endp
Читать полностью »
Автор: xrnd | Рубрика: Учебный курс | 16-11-2010
Отличительной особенность FASM является очень гибкая и мощная поддержка макросов. В этой статье мы рассмотрим лишь основы создания макросов, так как эта тема довольно обширна и рассказать всё в одной статье не получится.
Что же такое макросы? Макросы — это шаблоны для генерации кода. Один раз создав макрос, мы можем использовать его во многих местах в коде программы. Макросы делают процесс программирования на ассемблере более приятным и простым, а код программы получается понятнее. Макросы позволяют расширять синтаксис ассемблера и даже добавлять собственные «команды», которых нет в процессоре.
Обработкой макросов занимается препроцессор FASM. Преобразование исходного кода в исполняемый код FASM выполняет в два этапа. Первый этап — препроцессирование, а второй — собственно ассемблирование или компиляция. На первом этапе происходит вычисление всех числовых выражений, вместо констант и названий меток подставляются их фактические значения, вместо макросов подставляется сгенерированный код. На втором этапе все данные и машинные команды преобразуются в соответствующие байты, и в результате получается исполняемый файл требуемого формата.
Синтаксис создания макроса
Для создания макроса используется директива macro. Эта директива имеет следующий синтаксис:
macro < название_макроса> [< список_параметров>]
{
< тело_макроса>
} |
macro < название_макроса> [< список_параметров>]
{
< тело_макроса>
}
Читать полностью »
Автор: xrnd | Рубрика: Учебный курс | 03-11-2010
Не сомневаюсь, что объявлять метки вы уже научились 🙂 Однако, синтаксис FASM не ограничивается объявлением простых меток. В этой части мы рассмотрим дополнительную директиву для создания меток, а также научимся использовать локальные и анонимные метки.
В синтаксисе FASM существует 3 основных способа объявления меток:
1. Имя метки, после которого ставится двоеточие. Это самый простой способ. Обычно так объявляются метки в коде. (Подробнее об этом способе читайте в части 13 учебного курса)
exit_app:
mov ax,4C00h
int 21h |
exit_app:
mov ax,4C00h
int 21h
2. Использование директив объявления данных. Имя переменной является по сути той же меткой. Отличие от первого способа в том, что дополнительно с именем метки связывается размер переменной. (Подробнее читайте в части 5 учебного курса)
x db 5
y dw 34,1200,?
z rd 1 |
x db 5
y dw 34,1200,?
z rd 1
Читать полностью »