Главная · Поиск книг · Поступления книг · 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 ... 9 10 11 12 13 14 15  16 17 18 19 20 21 22 ... 85
само значение.  Многие команды  имеют  два  операнда:  первый  может  быть
регистр или адрес памяти, а второй - непосредственная константа.

     Использование  непосредственного  операнда  более  эффективно,    чем
oпределение числовой константы в сегменте данных и организация  cсылки  на
нее в операнде команды MOV, например,

               Сегмент данных:     AMT1 DW   0123H
               Сегмент кодов:           MOV  AX,AMT1


                     Длина непосредственных операндов
                    ----------------------------------
     Длина непосредственной константы зависит от длины  первого  операнда.
Например, следующий непосредственный  операнд  является  двухбайтовым,  но
регистр AL имеет только один байт:

               MOV  AL,0123H  (ошибка)

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

               ADD  AX,25H    (нет ошибки)

то ассемблер расширяет непосредственный  операнд  до  двух  байт,  0025  и
записывает объектный код в виде 2500.


                         Непосредственные форматы
                        --------------------------
     Непосредственная константа может  быть  шестнадцатиричной,  напpимер,
0123H;  десятичной,  например,  291  (которую  ассемблер  конвертирует   в
шест.0123); или двоичной, например, 100100011В  (которая  преобразуется  в
шест. 0123).
     Ниже  приведен  список  команд,  которые  допускают  непосредственные
операнды:

     Команды пересылки и сравнения:     MOV, CMP.
     Арифметические команды:            ADC, ADD, SBB, SUB.
     Команды сдвига:                    RCL, RCR, ROL, ROR, SHL, SAR, SHR.
     Логические команды:                AND, OR, TEST, XOR.

     На рис.5.3 приведены примеры допустимых  команд  с  непосредственными
операндами.  В  последующих главах будут объяснены команды арифметического
переноса,  сдвига и логические команды. Поскольку сейчас данные примеры не
предназначены   для   выполнения,   в  них  опущено  определение  стека  и
инициализация сегментных регистров.

__________________________________________________________________________

                              page    60,132
                      TITLE   EXIMM   (EXE) Пример непосредств. операндов
                      ;       (Кодируется для ассемблирования,
                      ;                   но не для выполнения)
0000                  DATASG  SEGMENT PARA 'Data'
0000 ??               FLD1    DB      ?
0001 ????             FLD2    DW      ?
0003                  DATASG  ENDS

0000                  CODESG  SEGMENT PARA 'Code'
0000                  BEGIN   PROC    FAR
                              ASSUME  CS:CODESG,DS:DATASG

                      ;               Операции пересылки и сравнения:
                      ;               ------------------------------
0000 BB 0113                  MOV     BX,275   ;Пересылка
0003 3C 19                    CMP     AL,H     ;Сравнение

                      ;               Арифметические операции:
                      ;               -----------------------
0005 14 05                    ADC     AL,5     ;Сложение с переносом
0007 80 C7 0C                 ADD     BH,12    ;Сложение
000A 1C 05                    SBB     AL,5     ;Вычитание с заемом
000C 80 2E 000 R 05           SUB     FLD1,5   ;Вычитание

                      ;               Ротация и сдвиг (только на 1 бит):
                      ;               ---------------------------------
0011 D0 D3                    RCL     BL,1     ;Ротация влево с переносом
0013 D0 DC                    RCR     AH,1     ;Ротация вправо с переносом
0015 D1 06 0001 R             ROL     FID2,1   ;Ротация влево
0019 D0 C8                    ROR     AL,1     ;Ротация вправо
001B D1 E1                    SAL     CX,1     ;Сдвиг влево
001D D1 FB                    SAR     BX,1     ;Арифм. сдвиг вправо
001F D0 2E 0000 R             SHR     FLD1,1   ;Сдвиг вправо

                      ;               Логические операции:
                      ;               -------------------
0023 24 2C                    AND     AL,00101100B ;AND (регистр)
0025 80 CF 2A                 OR      BH,2AH   ;OR (регистр)
0028 F6 C3 7A                 TEST    BL,7AH   ;TEST (регистр)
002B 80 36 0000 R 23          OR      FLD1,23H ;XOR (память)
0030                  BEGIN   ENDP
0030                  CODESG  ENDS
                              END
__________________________________________________________________________

     Рис.5.3. Команды с непосредственными данными.


     Для создания  элементов,  длиннее  чем два байта,  можно использовать
цикл (см. гл.7) или строковые команды (см. гл.11).


     ДИРЕКТИВА EQU
     ________________________________________________________________

     Директива EQU не определяет элемент данных, но  определяет  значение,
которое  может  быть  использовано  для  постановки  в  других   командах.
Предположим, что в сегменте данных закодирована следующая директива EQU:

               TIMES     EQU  10

Имя, в данном случае TIMES, может быть  представлено  любым  допустимым  в
ассемблере  именем.  Теперь,  в  какой-бы  команде  или    директиве    не
использовалось слово TIMES  ассемблер  подставит  значение  10.  Например,
ассемблер преобразует директиву

               FIELDA    DB   TIMES DUP (?)
в
               FIELDA    DB   10 DUP (?)

     Имя, связанное с некоторым значением с помощью директивы  EQU,  может
использоваться в командах, например:

               COUNTR    EQU  05
                         ...
                         MOV  CX,COUNTR

     Ассемблер заменяет имя COUNTR в команде MOV на значение 05,  cоздавая
операнд с непосредственным значением, как если бы было закодировано

               MOV  CX,05     ;Ассемблер подставляет 05

     Здесь преимущество  директивы  EQU  заключается  в  том,  что  многие
команды могут использовать значение, определенное по  имени  COUNTR.  Если
это значение  должно  быть  изменено,  то  изменению  подлежит  лишь  одна
директива EQU.  Естественно, что использование директивы EQU разумно  лишь
там, где подстановка имеет смысл для ассемблера.  В  директиве  EQU  можно
использовать символические имена:

               1.   TP   EQU  TOTALPAY
               2.   MPY  EQU  MUL

Первый пример предполагает, что в сегменте данных программы опpеделено имя
TOTALPAY.  Для любой команды, содержащей операнд TP, ассемблер заменит его
на адрес TOTALPAY.  Второй пример показывает возможность  использования  в
программе слова MPY вместо обычного мнемокода MUL.


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

     - Имена элементов данных в  программе  должны  быть  уникальны  и  по
возможности наглядны. Например, элемент для зарплаты служащего может иметь
имя EMPWAGE.

     - Для определения символьных строк используйте директиву DB, так  как
ее формат допускает строки длиннее двух байт и формирует их  в  нормальной
последовательности (слева-направо).

     - Будьте  внимательны  при  указании  десятичных  и  шест.  значений.
Сравните, например, сложение содержимого регистра AX с десятичным 25  и  с
шест. 25:

               ADD  AX,25     ;Прибавить 25
               ADD  AX,25H    ;Прибавить 37

     - Помните, что директивы DW, DD и DQ записывают числовое  значение  в
объектном коде в обратной последовательности байт.

     - Используйте элементы DB для операций с полурегистрами (AL, AH, BL и
т.д.) и DW для операций с полными регистрами (AX, BX, CX и т.д.). Числовые
элементы, определенные директивами DD и DQ имеют специальное применение.

     -  Следите  за  соответствием  непосредственных  операндов    размеру
регистра:  однобайтовая  константа  -  однобайтовый  регистр  (AL,    BH),
двухбайтовая константа - полный регистр (AX, BX).


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

     5.1.  Какова  длина  в  байтах  для  элементов  данных,  определенных
директивами: а) DW, б) DD, в) DT, г) DB, д) DQ?

     5.2.  Определите  символьную  строку  по  имени  TITLE1,   содержащую
константу RGB Electronics.

     5.3. Определите следующие числовые  значения  в  элементах  данных  с
именами от FLDA до FLDE:

          a)  четырехбайтовый  элемент,  содержащий    шест.    эквивалент
     десятичного числа 115;
          b) однобайтовый элемент, содержащий шест. эквивалент десятичного
     числа 25;
          c) двухбайтовый элемент, содержащий неопределенное значение;
          d)  однобайтовый  элемент,  содержащий    двоичной    эквивалент
     десятичного числа 25;
          e) директиву DW, содержащую последовательные  значения  16,  19,
     20, 27, 30.

     5.4. Покажите сгенерированный шест. объектный код для а) DB '26' и б)
DB 26.

     5.5. Определите ассемблерный шест. объектный код для а) DB 26H, б) DW
2645H, в) DD 25733AH, г) DQ 25733AH.

     5.6. Закодируйте следующие команды с непосредственными операндами:

          а) загрузить 320 в регистр AX;
          б) сравнить поле FLDB с нулем;
          в) прибавить шест. 40 к содержимому регистра BX;
          г) вычесть шест. 40 из регистра CX;
          д) сдвинуть содержимое поля FLDB на один бит влево;
          е) сдвинуть содержимое регистра CH на один бит вправо.

     5.7. Введите и ассемблируйте элементы данных и  команды  из  вопросов
5.2,  5.3 и 5.6.  Стек для этого упражнения не требуется. Также не следует
выполнять компоновку.  Для  проверки  ассемблированного  кода  используйте
отладчик   DEBUG.  Распечатайте  LST-файл  (листинг),  если  в  результате
ассемблирования не будет сообщений об ошибках.  Не забудьте  команду  MODE
LPT1:132,6 для установки ширины печати.



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

Реклама