Исполняемые СОМ-файлы, их отличие от ЕХЕ-файлов, примеры
Ассемблер – это язык программирования низкого уровня и программа, написанная на Ассемблере, должна пройти три этапа обработки на компьютере, как и программа, написанная на любом другом языке программирования. 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.
Популярное: Как распознать напряжение: Говоря о мышечном напряжении, мы в первую очередь имеем в виду мускулы, прикрепленные к костям ... Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние... Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (1808)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |