Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
FASM_Команды_МП.doc
Скачиваний:
29
Добавлен:
03.06.2015
Размер:
217.6 Кб
Скачать

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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]