Программист онлайн. Полезные тулзы для девелопера в вебе

Альтернативный компилятор ассемблера для х86. Ассемблер написан сам на себе имеет очень простой синтаксис. Позволяет создавать.com файл для ДОС. Поддерживает 32 разрядные режимы адресации и данных. Доступен вместе с исходным кодом.

Описание ассемблера.

  • Ассемблер работает из командной строки. Входной файл должен иметь любое имя с расширением:
    • .xxx или любым другим - значения не имеет, главное чтобы оно было

    Запуск на компиляцию:asm filename.ext. Результат - сообщение об ошибке в строке с № или filename.com / filename.obj

  • Ассемблер создает только*.com файлы, *.exe не созжаются. Конечно.com файл имеет ограничение 64 кб. кода, однако вряд ли кто-нибудь напишет на ассемблере больше. Т.к. создаются только*.com файлы не надо думать о сегментах. Нет у ассемблера и компоновщика. Он просто не нужен.
  • Ассемблер позволяет создавать модули*.obj , которые потом можно внедрять в код программ, как внешние подключаемые модули – подпрограммы.
  • Команды можно записывать в строчку разделяя их";"
  • Разделительные пробелы между командами и операндами вставлятьНЕ обязательно. Система команд х86 позволяет интерпретировать их и без пробелов.
  • Поскольку командаMOV встречается в программах на ассемблере наиболее часто ее имя писать не обязательно.
  • Регистр не имеет значения. Компилятор одинаково интерпретирует строки

    MOV AH,09
    movah,9
    aH,9

  • Ассемблер понимает 32 битные режимы адресации и автоматически вставляет префискы 32 битного адреса и данных, 66 и 67, когда это необходимо
  • Cистемa сообщения об ошибках довольно слабая. Сообщениеошибка в строке N следует понимать, какошибка в строке N +/- 1.
  • Команды математического сопроцессораНЕ поддерживаются .
  • * Коментарии вставляются между парными*
  • Основными синтаксическими элементами являются символы"=" и " () "
    • =Label= Вводит меку адреса.
    • (Label) вставляет значение адреса в код.

    Метки чувствительны к регистру.

Дальше рассмотрим пример HelloWorld .

* Кстати комментарии вставляются между парными звездочками
Пример1 "Hello World" выводит на экран надпись.*

JMPS(S)
=A1= "Hello World !"
=A2= 0A
=S= AX,B800;ES,AX;AX,3;INT10
CX,(A2-A1);SI,(A1);DI,500
AH,[(A2)]
=L= LODSB;STOSW;LOOP(L)
RET

Первая строка - это короткий переход к началу программы. Ассемблер располагает код и данные именно в том порядке, в котором вы их расположили в тексте.

JMP - кодирует длинный переход в пределах сегмента.
JMPS - короткий +/- 127 байт.
Со второй строкой все понятно. Третья строка:
По адресу (А2) в памяти ЭВМ размещается байт равный 0А.
Т.е.
Хотите зарезервировать в памяти байт - пищите так:
=vmode= 00 или =adr= 12
Надо выделить два байта пишите:
=X= 0000 или wo0
или
=Y=
wo something for example rd ptr 1234

Есть три ключевых слова определяющих размер.

  • by- BYTE (8)
  • wo - WORD (16)
  • dw - DWORD (32)

ассемблер проигнорирует все что встретит между этими буквами и первой цифрой.
Нужен массив из двойных слов - пожалуйста:
=array= dw0;12345678;01234;dw12;...
Желаете иметь таблицу адресов чего-нибудь - no problem:
=mytable= (adr1);(adr2);(adr3);dword(adr4)...
C адресами возможны следующие манипуляции:
CX,(A2-A1) * В CX получается длина строки(см пример)*
jmps (adr)+2;
mov ,(adr3-adr4)-5
В 386 процессоре появились команды длинного условного перехода. Отличаются они от коротких так:
JZ (adr) - короткий
JZ
_N (adr) - длинный.
Префиксы "66" и "67" вставляются автоматически.
Префиксы сегментов надо использовать в следующем виде:
ES:
LODSB
или
ES:;LODSB
SS:;MOVAX,}