Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Питер Абель Весь текст 992.61 Kb

Ассемблер и программирование для IBM PC

Предыдущая страница Следующая страница
1 ... 10 11 12 13 14 15 16  17 18 19 20 21 22 23 ... 85
сегмент данных, а регистр 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
Предыдущая страница Следующая страница
1 ... 10 11 12 13 14 15 16  17 18 19 20 21 22 23 ... 85
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (15)

Реклама