Программист онлайн. Полезные тулзы для девелопера в вебе
Альтернативный компилятор ассемблера для х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,}