Пример: Глобальная сеть INTERNET
Я ищу:
На главную  |  Добавить в избранное  

Главная/

Программирование, базы данных. /

Язык макроассемблера IBM PC

←предыдущая следующая→
1 2 3 4 5 6 7 8 9 10 11 12 

восьмиричным числом - буква q или o,  за двоичным числом - буква b.

Примеры:

A DB 162     ;описать константу-байт 162 и дать ей имя A

       B DB 0A2h    ;такая же константа, но с именем B

       С DW -1      ;константа-слово -1 с именем С

D DW 0FFFFh  ;такая же константа-слово, но с именем D

       E DD -1      ;-1 как двойное слово

    Константы-символы описываются в директиве DB  двояко:  указывается либо код символа (целое от 0 до 255), либо сам символ в кавычках (оди­нарных или двойных);  в последнем случае ассемблер сам заменит  символ на его код. Например, следующие директивы эквивалентны (2A - код звез­дочки в ASCII):

        CH DB 02Ah


CH DB '*' CH DB "*"

    Константы-адреса, как правило, задаются именами. Так, по директиве

        ADR DW CH

будет отведено слово памяти, которому дается имя ADR и в которое запи­шется адрес (смещение),  соответствующий имени CH.  Если  такое же имя описать в директиве DD,  то ассемблер автоматически добавит к смещению имени его сегмент и запишет смещение в первую половину двойного слова, а сегмент - во вторую половину.

    По любой из директив  DB, DW и DD  можно описать переменную,  т.е. отвести ячейку, не дав ей начального значения.  В этом случае в правой части директивы указывается вопросительный знак:

F DW ?  ;отвести слово и дать ему имя F, ничего в этот байт не ;записывать

    В одной директиве можно описать сразу несколько констант и/или пе­ременных одного и того же размера,  для чего их надо перечислить через запятую. Они размещаются в соседних ячейках памяти. Пример:

       G DB 200, -5, 10h, ?, 'F'

Имя,  указанное в директиве,  считается именующим  первую из констант. Для ссылок на остальные в MASM используются выражения вида  <имя>+<це­лое>; например, для доступа к байту с числом -5 надо указать выражение G+1, для доступа к байту с 10h - выражение G+2 и т.д.

    Если в директиве DB перечислены только символы, например:

       S DB 'a','+','b'

тогда эту директиву можно записать короче,  заключив все эти символы в одни кавычки:

       S DB 'a+b'

    И, наконец, если в директиве описывается несколько одинаковых кон­стант (переменных), то можно воспользоваться конструкцией повторения

        k DUP(a,b,...,c)

которая эквивалентна  повторенной k раз последовательности  a,b,...,c. Например, директивы

      V1 DB 0,0,0,0,0

      V2 DW ?,?,?,?,?,?,?,?,?,'a',1,2,1,2,1,2,1,2

можно записать более коротко таким образом:

      V1 DB  5 DUP(0)

      V2 DW  9 DUP(?), 'a', 4 DUP(1,2)

1.3. ПРЕДСТАВЛЕНИЕ КОМАНД. МОДИФИКАЦИЯ АДРЕСОВ.

         1.3.1 Структура команд. Исполнительные адреса

    Машинные команды ПК занимают от 1 до 6 байтов.

    Код операции (КОП)  занимает один или два первых байта команды.  В ПК столь много различных операций, что для них не хватает  256 различ­ных КОПов,  которые можно представить в одном байте. Поэтому некоторые операции объединяются в группу и им дается один и тот же КОП,  во вто­ром же байте этот КОП уточняется. Кроме того, во втором байте указыва­ются типы и способ адресации операндов. Остальные байты команды указы­вают на операнды.

    Команды могут иметь  от 0 до 3 операндов,  у большинства команд  ­один или два операнда.  Размер операндов  - байт  или  слово  (редко ­двойное слово).  Операнд может быть указан в самой команде  (это  т.н. непосредственный операнд),  либо может находиться в одном из регистров ПК и тогда в команде указывается этот регистр, либо может находиться в ячейке памяти и тогда в команде тем или иным способом указывается  ад­рес этой ячейки.  Некоторые команды требуют, чтобы операнд находился в фиксированном месте (например, в регистре AX), тогда операнд  явно  не указывается в команде.  Результат выполнения команды  помещается в ре­гистр или ячейку памяти, из которого (которой),  как правило,  берется первый операнд. Например, большинство команд с двумя операндами реали­зуют действие

        op1 := op1 _ op2

где op1  - регистр или ячейка,  а op2  - непосредственный операнд, ре­гистр или ячейка.

    Адрес операнда разрешено модифицировать по одному или двум регист­рам.  В первом случае  в качестве регистра-модификатора  разрешено ис­пользовать регистр BX, BP, SI или DI (и никакой иной).  Во втором слу­чае один из модификаторов обязан быть регистром BX или BP,  а другой -

регистром SI или DI;  одновременная модификация по BX и BP или SI и DI недопустима.  Регистры BX и BP  обычно используются  для хранения базы (начального адреса) некоторого участка памяти (скажем, массива)  и по­тому называются базовыми регистрами, а регистры SI и DI часто содержат индексы элементов массива  и потому называются  индексными регистрами. Однако такое распределение ролей необязательно, и, например, в SI мо­жет находиться база массива, а в BX - индекс элемента массива.

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

           A, A[M] или A[M1][M2],

где A - адрес, M - регистр BX, BP, SI или DI,  M1 - регистр BX или BP, а M2 - регистр SI или DI. Во второрм и третьем варианте A может отсут­ствовать, в этом случае считается, что A=0.

    При выполнении команды  процессор прежде всего вычисляет  т.н. ис­полнительный (эффективный) адрес  -  как сумму адреса, заданного в ко­манде, и текущих значений  указанных  регистров-модификаторов,  причем все  эти       величины  рассматриваются как неотрицательные и суммирование

ведется по модулю 2^16 ([r] означает содержимое регистра r):

       A        :    Aисп = A

       A[M]     :    Aисп = A+[M] (mod 2^16)

       A[M1][M2]:    Aисп = A+[M1]+[M2] (mod 2^16)

    Полученный таким образом 16-разрядный адрес определяет т.н. смеще­ние - адрес, отсчитанный от начала некоторого сегмента (области) памя­ти.  Перед обращением к памяти процессор еще добавляет к смещению  на­чальный адрес этого сегмента (он хранится в некотором сегментном реги­стре),  в результате чего получается  окончательный  20-разрядный  ад­рес, по которому и происходит реальное обращение к памяти (см. 1.4).

         1.3.2 Форматы команд

    В ПК форматы машинных команд достаточно разнообразны.  Для примера приведем лишь основные форматы команд с двумя операндами.

    1) Формат "регистр-регистр" (2байта):

          -------------   ----------------

          |  КОП  |d|w|   | 11 |reg1|reg2|

          -------------   ----------------

           7     2 1 0     7  6 5  3 2  0

Команды  этого формата описывают обычно действие  reg1:=reg1_reg2  или

reg2:=reg2_reg1. Поле КОП первого байта указывает на операцию (_), ко­торую надо выполнить.  Бит w определяет размер операндов, а бит d ука­зывает, в какой из регистров записывается результат:

       w = 1 - слова      d = 1 - reg1:=reg1_reg2

         = 0 - байты        = 0 - reg2:=reg2_reg1

Во втором байте  два левых бита  фиксированы (для данного формата),  а трехбитовые поля reg1 и reg2 указывают на регистры, участвующие в опе­рации, согласно следующей таблице:


reg    w=1  w=0         reg    w=1  w=0 -----------------       ----------------­

000     AX   AL         100     SP   AH

         001     CX   CL         101     BP   CH

         010     DX   DL         110     SI   DH

         011     BX   BL         111     DI   BH

2) Формат "регистр-память" (2-4 байта):


      

←предыдущая следующая→
1 2 3 4 5 6 7 8 9 10 11 12 


Copyright © 2005—2007 «RefStore.Ru»