Исполняемые СОМ-файлы, их отличие от ЕХЕ-файлов, примеры

Ассемблер – это язык программирования низкого уровня и программа, написанная на Ассемблере, должна пройти три этапа обработки на компьютере, как и программа, написанная на любом другом языке программирования.

I этап - преобразование исходного модуля в объектный – ассемблирование. Исходных модулей может быть 1 или несколько.

II этап - с помощью программы редактора связей объектные модули объединяются в загрузочный, исполняемый модуль.

III этап – выполнение программы.

Существует два типа исполняемых модулей (исполняемых файлов): exe-файл (<имя>.exe) и com-файл (<имя>.com). В результате выполнения второго этапа получается исполняемый exe-файл, чтобы получить com-файл, необходимо выполнить еще один этап обработки - преобразование exe-файла в com-файл.

После обработки компилятором и редактором связей получаем exe-файл, который содержит блок начальной загрузки, размером не менее 512 байт, но существует возможность создания другого вида исполняемого файла, который может быть получен на основе exe-файла с помощью системной обрабатывающей программы EXE2BIN.com или его можно создать с помощью среды разработки. Но не из всякого exe-файла можно создать com-файл. Исходный файл, для которого можно создать com-файл, должен удовлетворять определенным требованиям.

Исходный файл должен занимать только один сегмент памяти (и программа и данные только в одном сегменте). Стек не описывается, создается автоматически. Поскольку данные вместе с программой, то сегмент данных не определяется отдельно. Программа располагается в одном сегменте, все сегментные регистры перед началом выполнения программы в качестве значений содержат адрес блока, который называется префиксом сегмента программы (PSP). Этот блок размером 256 байтов размещается и перед EXE, и перед COM-файлом. Так как адрес первой исполняемой команды оказывается отстоящим на 256 байтов от начала сегмента, то для обхода этого блока используется специальная директива ORG 100h.

Если сравнивать EXE и COM-файлы для одной и той же программы, то вторые файлы меньше как минимум на 512 байт. Но с другой стороны первые файлы могут занимать произвольное количество сегментов в отличие от вторых. Таким образом рекомендуются небольшие программы писать под COM исполнительные файлы.

Отличия exe-файла от com-файла:

В com-файлах отсутствует блок начальной загрузки и следовательно он занимает меньше места, чем exe-файл.

exe-файл может занимать произвольный объем ОП. com-файл может занимать только один сегмент памяти.

Стек создается автоматически ОС, поэтому у пользователя нет необходимости выделять для него место. Данные располагаются там же, где и программа.

Т.к. вся программа содержится в одном сегменте, перед выполнением программы все сегментные регистры содержат в качестве значения адрес префикса программного сегмента – PSP

PSP - 256 байтный блок, который содержится как в exe-файле, так и в com-файле, и т.к. адрес первой исполняемой команды отстоит на 256 (100h) байтов от адреса начала сегмента, то сразу после директивы ASSUME используется специальная директива org 100h, осуществляющая обход префикса программного сегмента

Пример создания com-файла.

TITLE Prog_Сom-файл

Page 60 , 85

СSeg Segment Para ‘Сode’

ASSUME SS:CSeg, DS:CSeg, CS:CSeg

Org 100h

Start: JMP Main

St1 DB ‘String1’, 13, 10, ‘$’

St2 DB ‘String2’, ‘$’

Main Proc

MOV AH, 9

LEA DX, St1

Int 21h

LEA DX, St2

Int 21h

MOV AH, 4CH

Int 21h

Main endp

CSeg ends

End Start

Model tiny

Code

JMP Met

St1 DB ‘String1’, ‘$’

Met: MOV AH, 09h

LEA DX, St1

Int 21h

MOV AH, 4Ch

Int 21h

End Met

3) --------------------------

Beg Proc

MOV AH, 9

LEA DX, St1

Int 21h

MOV AH, 4Ch

Int 21h

Beg endp

St1 DB ‘String1’, ‘$’

End beg

Замечания:

• Не каждый исходный файл удовлетворяет требованиям com-файла.

• Небольшие по объему программы рекомендуется оформлять как com-файлы.

• Исходный файл, написанный как com-файл, не может быть выполнен как exe-файл.

19) Команды двоичной арифметики: сложение, вычитание, умножение и деление

Сложение (вычитание) беззнаковых чисел выполняется по правилам аналогичным сложению (вычитанию) по модулю 2k принятым в математике. В информатике, если в результате более k разрядов, то к+1-й пересылается в CF.

X + Y = (X + Y) mod 2k = X + Y и CF = 0, если X + Y < 2k

X + Y = (X + Y) mod 2k = X + Y -2k и CF = 1, если X + Y >= 2k

Пример, работая с байтами (k=8), получим:

250 + 10 = (250 + 10) mod 28 = 260 mod 256 = 4

260 = 1 0000 01002, CF = 1, результат - 0000 01002 = 4

X - Y = (X - Y) mod 2k = X – Y и CF = 0, если X >= Y

X - Y = (X - Y) mod 2k = X + 2k –Y и CF = 1, если X < Y

Пример: в байте

1 - 2 = 28 + 1 - 2 = 257 – 2 = 255, CF = 1

Сложение (вычитание) знаковых чисел сводится к сложению (вычитанию) с использованием дополнительного кода.

X = 10n - |X|

В байте: -1 = 256 – 1 = 255 = 111111112

-3 = 256 – 3 = 253 = 111111012

3 + (-1) = ( 3 + (-1)) mod 256 = (3+255) mod 256 = 2

1 + (-3) = (1 + (-3)) mod 256 = 254 = 111111102

Ответ получили в дополнительном коде, следовательно результат получаем в байте по формуле X = 10n - |X| , т.е.

х = 256 – 254 = |2| и знак минус. Ответ -2.

Переполнение происходит, если есть перенос из старшего цифрового в знаковый, а из знакового нет и наоборот, тогда OF = 1. Программист сам решает какой флажок анализировать OF или CF, зная с какими данными он работает.

Арифметические операции изменяют значение флажков

OF, CF, SF, ZF, AF, PF.

В Ассемблере команда ‘+’

ADD OP1, OP2; (OP1) + (OP2) ® OP1

ADC OP1, OP2; (OP1) + (OP2) + (CF) ® OP1

XADD OP1, OP2; i486 и >

(OP1) « (OP2) (меняет местами), (OP1) + (OP2) ® OP1

INC OP1; (OP1) + 1 ® OP1

В Ассемблере команда ‘-‘

SUB OP1, OP2; (OP1) – (OP2) ® OP1

SBB OP1, OP2; (OP1) – (OP2) – (CF) ® OP1

DEC OP1; (OP1) – 1 ® OP1.

Примеры:

X = 1234AB12h, Y = 5678CD34h, X + Y =

MOV AX, 1234h

MOV BX, 0AB12h

MOV CX, 5678h

MOV DX, 0CD34h

ADD BX, DX

ADC AX, CX

X – Y = SUB BX, DX

SBB AX, CX

В командах сложения и вычитания можно использовать любые способы адресации:

ADD AX, mas[SI]; прямая с индексированием

SUB DX, mas[BX][DI];

ADD CX, 32h

Пример1:

MOV AL, 95h

ADD AL, 82h

95h + 82h = 117h 95 = 100101012 82 = 100000102

100101012 + 100000102 = 1 0001 01112, 10010101

CF = 1, OF = 1, SF = 0, ZF = 0, AF = 0, PF = 1. 10000010

Пример2: 1 00010111

MOV AL, 9h

SUB AL, 5h

9h – 5h = 4h 5 = 00000101 -5 = 11111011 9 = 00001001

9 + (-5) = 11111011 + 00001001 = 1 0000 0100

CF = 1, OF = 0, SF = 0, ZF = 0, AF = 1, PF = 0.

Наши рекомендации