Программа: команды длинной пересылки


НазваниеПрограмма: команды длинной пересылки
страница7/35
Дата публикации06.04.2013
Размер4.75 Mb.
ТипПрограмма
userdocs.ru > Информатика > Программа
1   2   3   4   5   6   7   8   9   10   ...   35
ГЛАВА 6 Программы в COM-файлах

__________________________________________________________________________

Ц е л ь: Объяснить назначение и использование COM-файлов и перевод

ассемблерных программ в формат COM-файлов.

ВВЕДЕНИЕ

________________________________________________________________

До сих пор вы писали, ассемблировали и выполняли програм мы в

EXE-формате. Компановщик LINK автоматически генерирует особый формат для

EXE-файлов, в котором присутствует специальный начальный блок (заголовок)

pазмером не менее 512 байт. (В гл.22 рассматривается содержимое начальных

блоков).

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

используемого COM-файла является COMMAND.COM. Программа EXE2BIN.COM в

оперативной системе DOS преобразует EXE-файлы в COM-файлы. Фактически эта

программа создает BIN (двоичный) файл, поэтому она и называется

"преобразователь EXE в Вin (EXE-to-BIN)". Выходной Вin-файл можно

переименовать в COM-файл.

РАЗЛИЧИЯ МЕЖДУ ПРОГРАММАМИ В EXE и COM-файлах

________________________________________________________________

Несмотря на то, что EXE2BIN преобразует EXE-файл в COM-файл,

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 файла.

^ ПРИМЕР COM-ПРОГРАММЫ

________________________________________________________________

Программа EXCOM1, приведенная на рис.6.1, аналогична программе на

рис.4.3, но изменена согласно требований COM-формата. Обратите внимание на

следующие изменения в этой COM-программе:

- Стек и сегмент данных отсутствует.

- Оператор ASSUME указывает ассемблеру установить относительные

адреса с начала сегмента кодов. Регистр CS также содержит этот адрес,

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

Директива ORG служит для резервирования 100 (шест.) байт от

начального адреса под PSP.

- Директива ORG 100H устанавливает относительный адрес для

начала выполнения программы. Программный загрузчик использует этот

адрес для командного указателя.

- Команда JMP используется для обхода данных, определенных в

программе.

Ниже показаны шаги для обработки и выполнения этой программы:

MASM [ответы на запросы обычные]

LINK [ответы на запросы обычные]

^ EXE2BIN B:EXCOM1,B:EXCOM1.COM

DEL B:EXCOM1.OBJ,B:EXCOM1.EXE (удаление OBJ и EXE-файлов)

Размеры EXE- и COM-программ - 788 и 20 байт соответственно. Учитывая

такую эффективность COM-файлов, рекомендуется все небольшие программы

создавать для COM-формата. Для трассировки выполнения программы от начала

(но не включая) команды RET введите DEBUG B:EXCOM1.COM.

Некоторые программисты кодируют элементы данных после команд так, что

первая команда JMP не требуется. Кодирование элементов данных перед

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

рекомендуемой в руководстве по ассемблеру.

__________________________________________________________________________

page 60,132

TITLE XCOM1 COM-программа для пересылки и сложения

CODESG SEGMENT PARA 'Code'

^ ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG

ORG 100H ;Начало в конце PSP

BEGIN: JMP MAIN ;Обход через данные

; ---------------------------------------------------

FLDA DW 250 ;Определение данных

FLDB DW 125

FLDC DW ?

; ---------------------------------------------------

MAIN PROC NEAR

MOV AX,FLDA ;Переслать 0250 в AX

ADD AX,FLDB ;Прибавить 0125 к AX

MOV FLDC,AX ;Записать сумму в FLDC

RET ;Вернуться в DOS

MAIN ENDP

^ CODESG ENDS

END BEGIN

__________________________________________________________________________

Рис.6.1. Пример COM-программы.

СТЕК ДЛЯ COM-ПРОГРАММЫ

________________________________________________________________

Для COM-файла DOS автоматически определяет стек и устанавливает

oдинаковый общий сегментный адрес во всех четырех сегментных pегистрах.

Если для программы размер сегмента в 64К является достаточным, то DOS

устанавливает в регистре SP адрес конца cегмента - шест.FFFE. Это будет

верх стека. Если 64К байтовый сегмент не имеет достаточно места для стека,

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

затем в стек нулевое слово.

Возможность использования стека зависит от размера программы и

ограниченности памяти. С помощью команды DIR можно определить pазмер файла

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

Все небольшие программы в этой книге в основном расчитаны на

COM-формат.

^ ОСОБЕННОСТЬ ОТЛАДКИ

________________________________________________________________

Несоблюдение хотя бы одного требования COM-формата может послужить

причиной неправильной работы программы. Если EXE2BIN обнаруживает oшибку,

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

конкретной причины. Необходимо проверить в этом случае директивы SEGMENT,

ASSUME и END. Если опущен ORG 100H, то на данные в префиксе программного

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

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

При выполнении COM-программы под управлением отладчика DEBUG

необходимо использовать команду D CS:100 для просмотра данных и команд. Не

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

команду Q отладчика. Некоторые программисты используют INT 20H вместо

команды RET.

Попытка выполнить EXE-модуль программы, написанной для COM-формата,

не имеет успеха.

^ ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ

________________________________________________________________

- Объем COM-файла ограничен 64К.

- COM-файл меньше, чем соответствующий EXE-файл.

- Программа, написанная для выполнения в COM-формате не содержит

стека и сегмента данных и не требует инициализации регистра DS.

- Программа, написанная для выполнения в COM-формате использует

директиву ORG 100H после директивы SEGMENT для выполнения с адреса после

префикса программного сегмента.

- Программа EXE2BIN преобразует EXE-файл в COM-файл, обусловленный

указанием типа COM во втором операнде.

- Операционная система DOS определяет стек для COM-программы или в

конце программы, если позволяет размер, или в конце памяти.

^ ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ

________________________________________________________________

6.1. Каков максимальный размер COM-файла?

6.2. Какие сегменты можно определить в программе, которая будет

преобразована в COM-файл?

6.3. Как обходится COM-файл при выполнении с фактом отсутствия

определения стека?

6.4. Программа в результате компановки получала имя SAMPLE.EXE.

Напишите команду DOS для преобразования ее в COM-файл.

6.5. Измените программу из вопроса 4.6 для COM-формата, обработайте

ее и выполните под управлением отладчика DEBUG.

ГЛАВА 7 Логика и Организация Программы

__________________________________________________________________________

Ц е л ь: Раскрыть механизм передачи управления в программе (циклы и

переходы) для логических сравнений и программной организации.

ВВЕДЕНИЕ

________________________________________________________________

До этой главы примеры выполнялись последовательно команда за

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

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

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

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

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

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

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

командой. Передача управления может осуществляться вперед для выполнения

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

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

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

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

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

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

Цикл: LOOP

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

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

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

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

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

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

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

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

^ КОМАНДА JMP

________________________________________________________________

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

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

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

В COM-программе на рис. 7.1 используется команда JMP. В pегистры AX,

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

операции:

прибавить 1 к регистру AX,

прибавить AX к BX,

удвоить значение в регистре CX.

Повторение цикла приводит к увеличению содержимого регистра AX:

1,2,3,4..., регистра BX: 1,3,6,10..., и регистра CX: 1,2,4,8... Начало

цикла имеет метку, в данном случае, A20: - двоеточие oбозначает, что метка

находится внутри процедуры (в данном случае BEGIN) в сегменте кода. В

конце цикла находится команда

JMP A20

которая указывает на то, что управление должно быть передано команде c

меткой A20. Обратите внимание, что адресная метка в операнде команды

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

бесконечному выполнению - такие циклы обычно не используются.

__________________________________________________________________________

page 60,132

TITLE EXJUMP (COM) Организация цикла с помощью JMP

0000 CODESG SEGMENT PARA 'Code'

^ ASSUME CS:CODESG,DS:CODESG,SS:CODESG

0100 ORG 100H

0100 MAIN PROC NEAR

0100 B8 0001 MOV AX,01 ;Инициализация AX,

0103 BB 0001 MOV BX,01 ; BX,

0106 B9 0001 MOV CX,01 ; и CX

0109 A20:

0109 05 0001 ADD AX,01 ;Прибавить 01 к AX

010C 03 D8 ADD BX,AX ;Прибавить 01 к BX

010E D1 E1 SHL CX,1 ;Удвоить CX

0110 EB F7 JMP A20 ;Переход на A20

0112 MAIN ENDP

^ 0112 CODESG ENDS

END MAIN

__________________________________________________________________________

Рис.7.1. Использование команды JMP.

Метку можно кодировать на одной строке с командой:

A20: ADD AX,01

или на отдельной строке:

A20:

ADD AX,01

В обоих случаях адрес A20 указывает на первый байт команды ADD.

Двоеточие в метке A20 указывает на тип метки - NEAR. Запомните: отсутствие

двоеточия в метке является частой ошибкой. В нашем примере A20

соответствует -9 байтам от команды JMP, в чем можно убедиться по

объектному коду команды - EBF7. EB представляет собой машинный код для

короткого перехода JMP, а F7 - отрицательное значение смещения (-9).

Команда JMP прибавляет F7 к командному указателю (IP), котоpый содержит

адрес команды после JMP (0112):

Дес. Шест.

Командный указатель: 274 112

Адрес в команде JMP: -9 F7 (двоичное дополнение)

--- ---

Адрес перехода: 265 109

В результате сложения получается адрес перехода - шест.109. Проверьте

по листингу программы, что относительный адрес метки действительно

соответствует шест.109. Соответственно операнд в команде JMP для перехода

вперед имеет положительное значение.

Команда JMP для перехода в пределах -128 до +127 байт имеет тип
1   2   3   4   5   6   7   8   9   10   ...   35

Похожие:

Программа: команды длинной пересылки iconПрограмма соревнований дата         время     мероприятие            место       
Соревнование проводится только в командном зачете. Состав команды – 2 человека. Общий зачет для мужских, женских и смешанных команд....
Программа: команды длинной пересылки iconПрограмма-драйвер. Назначение файла конфигурации. Командный процессор....
Общее понятие об информатике и информации. Свойства информации. Непрерывная и дискретная информация
Программа: команды длинной пересылки icon3. Падающие и отраженные волны в однородной длинной линии
Электрические свойства длинной линии характеризуются первичными параметрами, т е параметрами, отнесёнными к единице длины линии(1...
Программа: команды длинной пересылки iconКоличеству заказанных вещей! Так как стоимость пересылки из Китая...
Так как стоимость пересылки из Китая зависит от количества заказанного, чем больше, тем дешевле! Стоимость доставки фиксированная,...
Программа: команды длинной пересылки iconКонтрольные сроки пересылки посылок между городами федерального значения,...
Контрольные сроки пересылки посылок между городами федерального значения, административными центрами субъектов
Программа: команды длинной пересылки iconПрограмма тура
Петрозаводск. По пути – деление на команды для ориентирования, проведение автобусного этапа игры
Программа: команды длинной пересылки iconКонтрольные сроки пересылки Почтой России из Ростова-на-Дону (обычная посылка)

Программа: команды длинной пересылки iconТворческий марафон «Быстрее, выше, сильнее и вкуснее»
Капитан команды начинает фразу «мы…» команда хором «Зайчата, Отличники и т д. – название команды
Программа: команды длинной пересылки iconПрограмма круглого стола по кодексу профессиональной этики адвоката
Постановка проблемы необходимости профессиональных клятв, создание дискуссионного поля для команды
Программа: команды длинной пересылки icon27 сентября Международный День туризма ФотоКросс
Участие в соревнованиях командное. Команды от 3 до 10 человек включительно выставляются от каждой группы (курса). Все члены команды...
Вы можете разместить ссылку на наш сайт:
Школьные материалы


При копировании материала укажите ссылку © 2020
контакты
userdocs.ru
Главная страница