- •Компилирование шестнадцатиразрядных программ с помощью fasm Оглавление
- •1. Запуск компилятора
- •2. Ввод кода программы
- •2.1. Программа "com"
- •2.2. Программа "exe"
- •3. Задание кодов данных
- •4. Системный сервис
- •5. Компилирование программ
- •6. Задания для самостоятельной работы
- •Приложение № 1. Некоторые функции системного прерывания 21h Организация ввода с клавиатуры
- •Организация вывода
- •Приложение №2. Система машинных команд мп 8086 Команды пересылки данных
- •Команды управления процессом вычисления
- •Команды для выполнения действий над байтами
- •Прочие команды
2.2. Программа "exe"
Программы этого типа состоят из нескольких сегментов. Обычно таких сегментов три: сегмент кода, сегмент стека, сегмент данных.
Рис.2.2. Программа формата «ЕХЕ»
Пример программы с тремя сегментами. Программа выполняет те же действия, что и предыдущая.
format MZ ;EXE программа
entry csg:begin ;адрес первой команды программы
stack 512 ;размер стека – 512 байт
;=========================================
segment dsg ;сегмент данных
mes db 'Hello World !' строка байтов
db 10,13,'$'
segment csg сегмент кода
begin:
mov AX,dsg ;DS на данные
mov DS,AX
;============================================
mov AH,09 ;вывести строку
mov DX,mes
int 21h
;============================================
mov AH,08 ;ждать нажатия клавиши
int 21h
mov AX,4C00h ;завершение работы программы
int 21h
;=========================================
3. Задание кодов данных
Задание данных программы - кодов происходит в соответствующем сегменте. При этом используются описатели данных:
имя_кода описатель код
Здесь имя_кода – адрес кода в сегменте. Задаются адреса латинскими буквами. Регистр символов не различается. Описатель задает разрядность кода данных.
Таблица 2.1.Описатели кодов данных
Данное |
Описатель |
Разрядность |
Байт |
db |
Байт |
Слово |
dw |
Два байта - слово |
Двойное слово |
dd |
Четыре байта – двойное слово |
Значения кодов могут задаваться в десятичной системе исчисления, в двоичной системе, шестнадцатеричной, восьмеричной системе.
Шестнадцатеричный код (code) вводится по одной из схем:
codeh
0xcode
$code
В конце двоичного кода записывается буква b. Восьмеричный код должен заканчиваться буквой o.
Примеры:
code db 0CDh
code1 db 0xFF
code2 db 12o
offset dw 0DA10Fh
addr dd 1278FF1Dh
mask db 00001000b
c db ? ;неопределенное значение.
При задании шестнадцатеричного кода, если он начинается с буквы, то перед буквой нужно задать 0.
Допускается задавать строки и отдельные символы с помощью описателя db в этом случае строка или символ заключаются в пару апострофов ‘. Строка может содержать также коды символов.
Примеры
mes1 db ‘OK!’ ;строка
mes2 db ‘INPUT :’,10,13 ;строка с кодами
sym db ‘A’ ;символ
Допускается задание констант в виде K=10, либо в виде K equ 20. Для определения в процессе компиляции количества байтов в строке используется счетчик текущего адреса $.
Например:
mes db ‘Пример строки символов’
n=$-mes
Чтобы задать буфер для хранения кодов используется директива dup:
буфер описатель n dup(значение)
Например:
buf db 70 dup(‘*’)
В FASM используются так же директивы резервирования памяти
rb – зарезервировать байт
rw – зарезервировать слово
rd – зарезервировать двойное слово
Пример. Резервирование памяти на три слова: mybuf rw 3.
В командах FASM загрузка адреса кода в регистр выполняется командой
MOV R,имя_кода
Здесь R один из регистров общего назначения, или индексный регистр SI,DI,BP.
Что бы записать в регистр код, хранящийся по адресу, используют скобки [].
Пример. Пусть задан код символа sym db 'D'. Тогда можно использовать следующие команды:
mov DI,sym ;адрес символа в DI
mov CL,[sym] ;код символа в CL
mov BX,word[sym] ;код символа в BX
Последняя команда требует указания преобразователя разрядности word в машинное слово, так как первый операнд имеет разрядность два байта. В FASM используется также преобразование в байт с помощью описателя byte.