Новости проекта

Автор: xrnd | Рубрика: Новости | 05-12-2012

Приветствую всех читателей сайта «asmworld.ru»!

Грустно об этом сообщать, но в последнее время я совсем забросил написание статей и разбор комментариев. Много работы, да и других дел тоже хватает. Сейчас я занимаюсь очень интересными проектами. Пишу на ассемблере для AVR и PIC. Кроме того занимаюсь электроникой и пишу на C++ для компьютера. Паяю то, что не удаётся запрограммировать, и программирую то, что не удалось спаять. Пока не знаю, когда продолжу написание своего учебника и продолжу ли вообще.

Многие из вас мне пишут слова благодарности, и я очень рад, что мои статьи приносят кому-то пользу. Спасибо вам за добрые слова :)

Сайт не пропадёт и никуда не денется. Я за ним слежу, оплачиваю хостинг и домен. Так что заходите и читайте в любое время.

Предупреждаю, что ваши комментарии не появятся на сайте сразу после добавления! Приходит очень много мерзкого спама, фильтруется он плоховато, поэтому я проверяю комментарии вручную. Постараюсь делать это почаще, а то я тут обнаружил целую кучу непроверенных комментариев.

А вот рекламы на сайте больше нет. Денег от неё копейки, поэтому я её выпилил.

Желаю всем удачи и творческих успехов!

FASM Editor 2.0

Автор: xrnd | Рубрика: Инструменты | 07-09-2011

Вышла вторая версия среды разработки FASM Editor!

FASM Editor v2.0

Скачать FASM Editor 2.0

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

Читать полностью »