Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Различия между программами в ЕХЕ и СОМ-файлах

Поиск

cуществуют определенные различия между программой, выполняемой как

EXE-файл и программой, выполняемой как COM-файл.

 

Р а з м е р п р о г р а м м ы. EXE-программа может иметь любой

размер, в то время как COM-файл ограничен размером одного сегмента и не

превышает 64К. COM-файл всегда меньше, чем соответствующий EXE-файл; одна

из причин этого - отсутствие в COM-файле 512-байтового начального блока

EXE-файла.

 

С е г м е н т с т е к а. В EXE-программе определяется сегмент стека,

в то время как COM-программа генерирует стек автоматически. Таким образом

при создании ассемблерной программы, которая будет преобразована в

COM-файл, стек должен быть опущен.

 

С е г м е н т д а н н ы х. В EXE программе обычно определяется

сегмент данных, а регистр DS инициализируется адресом этого сегмента. В

COM-программе все данные должны быть определены в сегменте кода. Ниже

будет показан простой способ решения этого вопроса.

 

И н и ц и а л и з а ц и я. EXE-программа записывает нулевое слово в

стек и инициализирует регистр DS. Так как COM-программа не имеет ни стека,

ни сегмента данных, то эти шаги отсутствуют. Когда COM-программа начинает

работать, все сегментные регистры содержат адрес префикса программного

сегмента (PSP), - 256-байтового (шест. 100) блока, который резервируется

операционной системой DOS непосредственно перед COM или EXE программой в

памяти. Так как адресация начинается с шест. смещения 100 от начала PSP,

то в программе после оператора SEGMENT кодируется директива ORG 100H.

 

О б р а б о т к а. Для программ в EXE и COM форматах выполняется

ассемблирование для получения OBJ-файла, и компановка для получения

EXE-файла. Если программа создается для выполнения как EXE-файл, то ее уже

можно выполнить. Если же программа создается для выполнения как COM-файл,

то компановщиком будет выдано сообщение:

 

Warning: No STACK Segment

(Предупреждение: сегмент стека не определен)

 

Это сообщение можно игнорировать, так как определение стека в

программе не предполагалось. Для преобразования EXE-файла в COM-файл

используется программа EXE2BIN. Предположим, что EXE2BIN имеется на

дисководе A, а скомпонованный файл по имени CALC.EXE - на дисководе B.

Введите

 

EXE2BIN B:CALC,B:CALC.COM

 

Так как первый операнд всегда предполагает EXE файл, то можно не

кодировать тип EXE. Второй операнд может иметь другое имя (не CALC.COM).

Если не указывать тип COM, то EXE2BIN примет по умолчанию тип BIN, который

впоследствии можно переименовать в COM. После того как преобразование

будет выполнено можно удалить OBJ- и EXE-файлы.

Если исходная программа написана для EXE-формата, то можно, используя

редактор, заменить команды в исходном тексте для COM файла.

Логика и организация программы

Некоторые команды могут передавать управление, изменяя нормальную

последовательность шагов непосредственной модификацией значения смещения в

командном указателе. Ниже приведены четыре способа передачи управления

(все будут рассмотрены в этой главе):

 

Безусловный переход: JMP

Цикл: LOOP

Условный переход: Jnnn (больше,меньше,равно)

Вызов процедуры: CALL

 

Заметим, что имеется три типа адресов: SHORT, NEAR и FAR. Адресация

SHORT используется при циклах, условных пеpеходах и некоторых безусловных

переходах. Адресация NEAR и FAR используется для вызовов процедур (CALL) и

безусловных переходов, которые не квалифицируются, как SHORT. Все три

типа передачи управления воздействуют на содержимое регистра IP; тип FAR

также изменяет регистр CS.

 

Одной из команд обычно используемых для передачи управления является

команда JMP. Эта команда выполняет безусловный переход, т.е. обеспечивает

передачу управления при любых обстоятельствах.

. Команда LOOP, которая служит для этой цели, использует начальное значение в

регистре CX. В каждом цикле команда LOOP автоматически уменьшает

содержимое регистра CX на 1. Пока значение в CX не равно нулю, управление

передается по адресу, указанному в операнде, и если в CX будет 0,

управление переходит на следующую после LOOP команду. Дополнительно существует две разновидности команды LOOP - это LOOPE

(или LOOPZ) и LOOPNE (или LOOPNZ). Обе команды также уменьшают значение

регистра CX на 1. Команда LOOPE передает управление по адресу операнда,

если регистр CX имеет ненулевое значение и флаг нуля установлен (ZF=1).

Команда LOOPNE передает управление по адресу операнда, если регистр CX

имеет ненулевое значение и флаг нуля сброшен (ZF=0).

Флаговый регистр

Флаговый pегистр содержит 16 бит флагов, которые

управляются различными командами для индикации состояния операции. Во всех

случаях флаги сохраняют свое значение до тех пор, пока другая команда не

изменит его. Флаговый регистр содержит девять используемых бит.

 

Номер бита: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Флаг: * * * * O D I T S Z * A * P * C

 

Рассмотрим эти флаги в последовательности справа налево.

 

CF (Carry Flag) - флаг переноса. Содержит значение "переносов" (0 или

1) из старшего разряда при арифметических операциях и некоторых операциях

сдвига и циклического сдвига (см. гл.12).

 

PF (Parity Flag) - флаг четности. Проверяет младшие восемь бит

pезультатов операций над данными. Нечетное число бит приводит к установке

этого флага в 0, а четное - в 1. Не следует путать флаг четности с битом

контроля на четность.

 

AF (Auxiliary Carry Flag) - дополнительный флаг переноса.

Устанавливается в 1, если арифметическая операция приводит к переносу

четвертого справа бита (бит номер 3) в регистровой однобайтовой команде.

Данный флаг имеет отношение к арифметическим операциям над символами кода

ASCII и к десятичным упакованным полям.

 

ZF (Zero Flag) - флаг нуля. Устанавливается в качестве результата

aрифметических команд и команд сравнения. Как это ни странно, ненулевой

результат приводит к установке нулевого значения этого флага, а нулевой -

к установке единичного значения. Кажущееся несоответствие является,

однако, логически правильным, так как 0 обозначает "нет" (т.е. результат

не равен нулю), а единица обозначаeт "да" (т.е. результат равен нулю).

Команды условного перехода JE и JZ проверяют этот флаг.

 

SF (SIgn Flag) - знаковый флаг. Устанавливается в соответствии со

знаком результата (старшего бита) после арифметических опеpаций:

положительный результат устанавливает 0, а отрицательный - 1. Команды

условного перехода JG и JL проверяют этот флаг.

 

TF (Trap Flag) - флаг пошагового выполнения. Этот флаг вам уже

приходилось устанавливать, когда использовалась команда Т в отладчике

DEBUG. Если этот флаг установлен в единичное cостояние, то процессор

переходит в режим пошагового выполнения команд, т.е. в каждый момент

выполняется одна команда под пользовательским управлением.

 

IF (Interrupt Flag) - флаг прерывания. При нулевом состоянии этого

флага прерывания запрещены, при единичном - разрешены.

 

DF (DIrection Flag) - флаг направления. Используется в строковых

операциях для определения направления передачи данных. При нулевом

состоянии команда увеличивает содержимое регистров SI и DI, вызывая

передачу данных слева направо, при нулевом - уменьшает содержимое этих

регистров, вызывая передачу данных справа налево (см. гл.11).

 

OF (Overflow Flag) - флаг переполнения. Фиксирует арифметическое

переполнение, т.е. перенос вниз старшего (знакового) бита при знаковых

арифметических операциях.

Команды условного перехода

Типы данных, над которыми выполняются

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

пользоваться: беззнаковыми или знаковыми. Беззнаковые данные используют

все биты как биты данных; характерным примером являются символьные строки:

имена, адреса и натуральные числа. В знаковых данных самый левый бит

представляет собой знак, причем если его значение равно нулю, то число

положительное, и если единице, то отрицательное. Многие числовые значения

могут быть как положительными так и отрицательными.

В качестве примера предположим, что регистр AX содержит 11000110, а

BX - 00010110. Команда

 

CMP AX,BX

 

сравнивает содержимое регистров AX и BX. Если данные беззнаковые, то

значение в AX больше, а если знаковые - то меньше.

 

для беззнаковых данных есть переходы по состояниям равно, выше или ниже, а

для беззнаковых - равно, больше или меньше. Переходы по проверкам флагов

переноса, переполнения и паритета имеют особое назначение. Ассемблер

транслирует мнемонические коды в объектный код независимо от того, какую

из двух команд вы применили. Однако, команды JAE и JGE являясь явно

одинаковыми, проверяют различные флаги.

Расширенные операции пересылки

Процедура BEGIN инициализирует сегментные регистры и затем вызывает

процедуры B10MOVE и C10MOVE. Процедура B10MOVE пересылает содержимое поля

NAME1 в поле NAME2. Так как каждый раз пересылается только один байт, то

процедура начинает с самого левого байта в поле NAME1 и в цикле пересылает

затем второй байт, третий и т.д.:

 

NAME1: A B C D E F G H I

| | | | | | | | |

NAME2: J K L M N O P Q R

 

Для продвижения в полях NAME1 и NAME2 в регистр CX заносится значение 9, а

регистры SI и DI используются в качестве индексных. Две команды LEA

загружают относительные aдреса полей NAME1 и NAME2 в регистры SI и DI:

 

LEA SI,NAME1;Загрузка относительных адресов

LEA DI,NAME2; NAME1 и NAME2

 

Для пересылки содержимого первого байта из поля NAME1 в первый байт поля

NAME2 используются адреса в регистрах SI и DI. kвадратные скобки в

командах MOV обозначают, что для доступа к памяти используется адрес в

регистре, указанном в квадратных cкобках. Таким образом, команда

 

MOV AL,[SI]

 

означает: использовать адрес в регистре SI (т.е.NAME1) для пересылки

соответствующего байта в регистр AL. А команда

 

MOV [DI],AL

 

означает: пересылать содержимое регистра AL по адресу, лежащему в регистре

DI (т.е. NAME2).

Следующие команды увеличивают значения регистров SI и DI и уменьшают

значение в регистре SH. Если в регистре CX не нулевое значение, управление

передается на следующий цикл (на метку B20). Так как содержимое регистров

SI и DI было увеличено на 1, то следующие команды MOV будут иметь дело с

адресами NAME1+1 и NAME2+1. Цикл продолжается таким образом, пока не будет

передано содержимое NAME1+8 и NAME2+8.

Процедура C10MOVE аналогична процедуре B10MOVE с двумя исключениями:

она пересылает данные из поля NAME2 в поле NAME3 и использует команду LOOP

вместо DEC и JNZ.



Поделиться:


Последнее изменение этой страницы: 2016-08-15; просмотров: 1017; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.88.104 (0.007 с.)