Исполняемые СОМ-файлы, их отличие от ЕХЕ-файлов, примеры
Ассемблер – это язык программирования низкого уровня и программа, написанная на Ассемблере, должна пройти три этапа обработки на компьютере, как и программа, написанная на любом другом языке программирования.
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.