Главная /
Ассемблер /
Для чайников /
Быстрый старт /
MASM, TASM и WASM
Ассемблеры MASM, TASM и WASM отличаются между собой. Однако создание простых программ
для них практически не имеет отличий, за исключением самого ассемблирования и компоновки.
Итак, наша первая программа для MASM, TASM и WASM, которая выводит английскую букву «A»
в текущей позиции курсора, то есть в левом верхнем углу экрана:
.model tiny
.code
ORG 100h
start: MOV AH,2
MOV DL,41h
INT 21h
INT 20h
END start
Этот текст можно набрать в любом простом текстовом редакторе – например в БЛОКНОТЕ (NotePad)
от WINDOWS (но не в Word и не в другом «навороченном»). Однако я рекомендую «продвинутый»
текстовый редактор с подсветкой синтаксиса, например, PSPad (см. раздел
ВВЕДЕНИЕ). Затем сохраняем
этот файл с расширением .asm, например, в папке MYPROG. Назовем файл atest. Итак,
мы получили: C:\MYPROG\atest.asm.
ПРИМЕЧАНИЕ
Обратите внимание, что в первой команде мы записали 2 вместо 02h. MASM, TASM и WASM,
как и Emu8086, допускают такие «вольности». Хотя можно написать 02h – ошибки не будет.
Пояснения к программе:
.model tiny – 1-ая строка. Директива .model определяет модель памяти для конкретного
типа файлов. В нашем случае это файл с расширением COM, поэтому выбираем модель tiny,
в которой объединены сегменты кода, данных, и стека. Модель tiny предназначена для
создания файлов типа СОМ.
.code – 2-ая строка. Эта директива начинает сегмент кода.
ORG 100h – 3-ая строка. Эта команда устанавливает значение программного
счетчика в 100h, потому что при загрузке СОМ-файла в память, DOS выделяет под блок данных
PSP первые 256 байт (десятичное число 256 равно шестнадцатеричному 100h). Код программы
располагается только после этого блока. Все программы, которые компилируются в файлы типа СОМ,
должны начинаться с этой директивы.
start: MOV AH, 02h – 4-я строка. Метка start располагается перед первой
командой в программе и будет использоваться в директиве END, чтобы указать, с какой команды
начинается программа. Инструкция MOV помещает значение второго операнда в первый операнд.
То есть значение 02h помещается в регистр АН. Для чего это делается? 02h - это ДОСовская
функция, которая выводит символ на экран. Мы пишем программу для DOS, поэтому используем
команды этой операционной системы (ОС). А записываем мы эту функцию (а точнее ее номер)
именно в регистр АН, потому что прерывание 21h использует именно этот регистр.
MOV DL, 41h – 5-я строка. Код символа «A» заносится в регистр DL. Код
символа «A» по стандарту ASCII – это число 41h.
INT 21h – 6-я строка. Это и есть то самое прерывание 21h – команда,
которая вызывает системную функцию DOS, заданную в регистре АН (в нашем примере это
функция 02h). Команда INT 21h – основное средство взаимодействия программ с ОС.
INT 20h – 7-я строка. Это прерывание, которое сообщает операционной
системе о выходе из программы, и о передаче управления консольному приложению. В том случае,
если программа уже откомпилирована и запущена из ОС, команда INT 20h вернет нас в ОС (например,
в DOS).
END start – 8-я строка. Директива END завершает программу,
одновременно указывая, с какой метки должно начинаться ее выполнение.
Ну вот, программу мы написали. Но хотелось бы посмотреть, как она работает.
Для этого нужно сначала вызвать ассемблер, чтобы скомпилировать ее в объектный файл,
а затем вызвать компоновщик, который из объектного файла создаст исполняемый файл,
то есть программу типа COM. Для разных ассемблеров придётся выполнять эти действия по разному.