Главная · Поиск книг · Поступления книг · 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 ... 70 71 72 73 74 75 76  77 78 79 80 81 82 83 ... 85
                                  |   |
                                  w  reg = AX

Первый байт машинного кода указывает на размер в одно  слово  (w=1)  и  на
регистр AХ  (000).  Не  следует  обобщать  приведенные  примеры,  так  как
указание регистра и бита w может быть в различных позициях кода.


     БАЙТ СПОСОБА АДРЕСАЦИИ
     ________________________________________________________________

     Байт способа адресации, если он присутствует,  занимает  второй  байт
машинного кода и состоит из следующих трех элементов:

          1) mod - двухбитового кода, имеющего значения 11 для  ссылки  на
     регистр и 00, 01 и 10 для ссылки на память;
          2) reg - трехбитового указателя регистра;
          3) r/m  -  трехбитового  указателя  регистра  или  памяти  (r  -
     регистр, m - адрес памяти).

     Кроме того, первый байт  машинного  кода  может  содержать  бит  "а",
который указывает направление потока между операндом 1 и операндом 2.
     Рассмотрим пример  сложения  содержимого  регистра  АХ  с  содержимым
регистра BX:

               ADD    BX,AX   00000011  11 011 000
                                    dw mod reg r/m

     В этом примере d=1 означает, что  mod  (11)  и  reg  (011)  описывают
операнд 1, а r/m (000) описывает операнд 2. Так как  бит  w=1,  то  размер
равен одному слову.  Таким образом, команда должна прибавить AX (OOQ) к BХ
(011).
     Второй байт команды в объектном коде указывает  большинство  способов
адресации памяти.  В следующем разделе способы  адресации  будут  подробно
рассмотрены.


                                 Биты MOD
                                ----------
     Два  бита  mod  определяют  адресацию  регистра  или  памяти.    Ниже
поясняется их назначение:

     00   биты г/m дают абсолютный  адрес,  байт  смещения  (относительный
          адрес) отсутствует;
     01   биты г/m дают  абсолютный  адрес  памяти  и  имеется  один  байт
          смещения;
     10   биты г/m дают абсолютный адрес и имеется два байта смещения;
     11   биты  г/m  определяют  регистр.  Бит  w  (в байте кода операции)
          определяет ссылку на восьми- или шестнадцатибитовый регистр.


                                 Биты REG
                                ----------
     Три бита  reg  (вместе  с  битом w) определяют конкретный восьми- или
шестнадцатибитовый регистр.


                                 Биты R/M
                                ----------
     Три бита г/m  (регистр/память)  совместно  с  битами  mod  определяют
способ адресации, как показано на рис.25.2.

__________________________________________________________________________

          r/m   mod=00    mod=01         mod=10      mod=1.1    mod=11
                                                       w=0        w=1
          000   BX+SI     BX+SI+disp     BX+SI+disp    AL         AX
          001   BX+DI     BX+DI+disp     BX+DI+disp    CL         CX
          010   BP+SI     BP+SI+disp     BP+SI+disp    DL         DX
          011   BP+DI     BP+DI+disp     BP+DI+disp    BL         BX
          100    SI        SI+disp         SI+disp     AH         SP
          101    DI        DI+disp         DI+disp     CH         BP
          110   Direct     BP+disp         BP+disp     DH         SI
          111    BX        BX+disp         BX+disp     BH         DI
__________________________________________________________________________

     Рис.25.2. Биты r/m


     ДВУХБАЙТОВЫЕ КОМАНДЫ
     ________________________________________________________________

     Рассмотрим пример сложения содержимого регистров BХ и AХ:

               ADD    BX,AX    0000 0011  11 011 000
                                      dw mod reg r/m

     d    1 означает,  что биты reg и w описывают операнд  1 (BХ),  а биты
          mod, r/m и w - Операнд 2 (AХ);
     w    1 определяет размер регистров в одно слово,
     mod  11 указывает, что операнд 2 является регистром;
     reg  011 указывает, что операнд 1 является регистром BХ;
     r/m  000 указывает, что операнд 2 является регистром AX.

     Рассмотрим пример умножения регистра AL на регистр BL:

               MUL    BL       11110110  11 100 011
                                      w mod reg r/m

Команда  MUL  предполагает,  что  регистр  AL  содержит  множимое.  Размер
регистра равен  одному  байту  (w  =  0),  mod  указывает  на  регистровую
операцию, г/m = 011 указывает на регистр BL.  В данном случае reg = 100 не
имеет смысла.


     ТРЕХБАЙТОВЫЕ КОМАНДЫ
     ________________________________________________________________

     Следующая команда MOV генерирует три байте машинного кода:

               MOV     mem,AX  10100001 dddddddd dddddddd

     Для команды пересылки из регистра AХ или AL необходимо знать, сколько
байтов участвует в операции: один или два. В данном примере w = 1 означает
слово, следовательно, предполагается 16-битовый регистр AХ.  Использование
во втором операнде регистра AL приведет к значению бита w = 0. Байты 2 и 3
содержат относительный адрес памяти. Команды, использующие регистры АХ или
AL, часто генерируют более эффективный (короткий) машинный код.


     ЧЕТЫРЕХБАЙТОВЫЕ КОМАНДЫ
     ________________________________________________________________

     Рассмотрим  пример  умножения  регистра  AL  на  значение  в  памяти.
Процессор  предполагает,  что  множимое  находится  в  регистре  AL    для
однобайтового умножения и в регистре AХ для Двухбайтового умножения:

               MUL    mem_byte         11110110  00 100 110
                                              w mod reg r/m

Для данной команды reg всегда имеет значение 100, mod =  00  указывает  на
операцию с памятью, a r/m=110  -  на  прямой  способ  адресации.  Машинная
команда также содержит два  следующих  байта,  определяющих  относительный
адрес памяти.
     Рассмотрим еще  один  пример,  иллюстрирующий  команду  LEA,  которая
всегда специфицирует двухбайтовый адрес:

               LEA     DX,mem 10001101  00 010 110
                                 LEA   mod rеg r/m

     Reg =010 означает регистр DX.  Mod =00 и  r/m=110  определяют  прямой
способ адресации памяти.  В следующих двух байтах содержится относительный
адрес.


     КОМАНДЫ В АЛФАВИТНОМ ПОРЯДКЕ
     ________________________________________________________________

     В данном разделе представлен набор  команд  Ассемблера  в  алфавитном
порядке.  Некоторые команды,  например  сдвиг  и  циклический  сдвиг,  для
краткости сгруппированы.  Ряд специальных команд  для  процессоров  80186,
80286 и 80386 выходят за рамки данной книги и поэтому в данной главе также
отсутствуют.  При  пояснении  команд  и  способов  адресации  используются
следующие сокращения:

addr           адрес памяти;
addr-high      первый байт адреса (старший);
addr-low       левый (младший) байт. адреса;
data           непосредственный операнд (8 бит при w=0 и 16 бит при w= 1);
data-high      правый (старший) байт непосредственного операнда;
data-low       левый (младший) байт непосредственного операнда;
disp           смещение (относительный адрес);
rеg            ссылка на регистр.


                AAA: Коррекция ASCII-формата для сложения
               -------------------------------------------
     О п е р а ц и я: Корректирует сумму двух ASCII-байтов в регистре  AL.
Если правые четыре бита регистра AL имеют значение больше 9  или  флаг  AF
установлен в 1,  то  команда  AAA  прибавляет  к  регистру  АН  единицу  и
устанавливает флаги AF и CF.  Команда всегда очищает четыре левых  бита  в
регистре AL.

     Ф л а г и: Команда воздействует на флаги AF и CF (флаги OF, PF, SF  и
ZF не определены).

     О б ъ е к т н ы й  к о д: 00110111 (без операндов).


                 AAD: Коррекция ASCII-формата для деления
                ------------------------------------------
     О п е р а ц и я: Корректирует ASCII-величины для деления. Команда AAD
используется перед делением неупакованных десятичных чисел в  регистре  AХ
(удаляет тройки ASCII-кода).  Эта команда корректирует делимое в  двоичное
значение в регистре AL для последующего двоичного деления.  Затем умножает
содержимое регистра AН на 10. прибавляет результат к содержимому  регистра
AL и очищает AН. Команда AAD не имеет операндов.

     Ф л а г и: Команда воздействует на флаги PF, CF, ZF (флаги AF CF и OF
не определены).

     О б ъ е к т н ы й  к о д: |11010101|00001010|.


                AAМ: Коррекция ASCII-формата для умножения
               --------------------------------------------
     О п е р а ц и я: Команда AAM используется  для  коррекции  результата
умножения двух неупакованных десятичных чисел.  Команда  делит  содержимое
регистра AL на 10, записывает частное в регистр AН, а  остаток  в  регистр
AL.

     Ф л а г и: Команда воздействует на флаги PF, SF и ZF (флаги AF  CF  и
OF не определены).

     О б ъ е к т н ы й  к о д: |11010100|00001010| (без операндов).


                AAS: Коррекция ASCII-формата для вычитания
               --------------------------------------------
     О п е р а ц и я: Корректирует разность двух ASCII-байтов  в  регистре
AL. Если первые четыре бита имеют значение больше 9 или флаг CF установлен
в 1, то команда AAS вычитает 6 из регистра AL и 1 из регистра АН, флаги AF
и CF при этом устанавливаются в 1. Команда  всегда  очищает  левые  четыре
бита в регистре AL.

     Ф л а г и: Команда воздействует на флаги AF и CF (флаги OF PF SF и ZF
не определены).

     О б ъ е к т н ы й  к о д: 00111111 (без операндов).


                        ADC: Сложение с переносом
                       ---------------------------
     О п е р а ц и я:   Обычно  используется  при  сложении   многословных
величин для учета бита переполнения в  последующих  фазах  операции.  Если
флаг CF установлен в 1, то команда ADC сначала прибавляет 1 к операнду  1.
Команда всегда прибавляет операнд 2 к операнду 1, аналогично команде ADD.

     Ф л а г и: Команда воздействует на флаги AF, CF, OF, PF, SF и ZF.

     О б ъ е к т н ы й  к о д (три формата):

          Регистр плюс регистр или память:
               |000100dw|modregr/m|
          Регистр АХ (AL) плюс непосредственное значение:
               |0001010w|-- data--|data, если w=1|
          Регистр или память плюс непосредственное значение:
                y100000sw|mod010r/m|--data--|data, если sw=01|


                       ADD: Сложение двоичных чисел
                      ------------------------------
     О п е р а ц и я: Прибавляет  один  байт  или  одно  слово  в  памяти,
регистре или непосредственно к содержимому регистра  или  прибавляет  один
байт или слово в регистре или непосредственно к памяти.

     Ф л а г и: Команда воздействует на флаги AF, CF, OF, PF, SF и ZF.

     О б ъ е к т н ы й  к о д (три формата):

          Регистр плюс регистр или память:
               |000000dw|modregr/rm|
          Регистр AX (AL) плюс непосредственное значение:
               |0000010w|--data--|data, если w=1|
          Регистр или память плюс непосредственное значение:
               |100000sw|mod000r/m|--data--|data, если BW=01|


                            AND: Логическое И
                           -------------------
     О п е р а ц и я: Команда выполняет поразрядную конъюнкцию  (И)  битов
двух  операндов.  Операнды  представляют  собой  одно-  или   двухбайтовые
величины  в  регистре  или  памяти.  Второй  операнд    может    содержать
непосредственные данные.  Команда AND проверяет два  операнда  поразрядно.
Если два проверяемых бита равны 1, то в  первом  операнде  устанавливается
единичное значение бита, в других случаях - нулевое. См. также команды OR,
XOR и TEST.

     Ф л а г и: Команда воздействует на флаги CF, OF, PF, SF и ZF (флаг AF
не определен).

     О б ъ е к т н ы й  к о д (три формата):
Предыдущая страница Следующая страница
1 ... 70 71 72 73 74 75 76  77 78 79 80 81 82 83 ... 85
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (15)

Реклама