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

Главная/

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

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

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

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

       |  КОП  |d|w|  |mod|reg|mem|  |адрес (0-2 байта)|

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

Эти команды описывают операции  reg:=reg_mem  или  mem:=mem_reg. Бит w первого байта определяет размер операндов (см. выше), а бит d указыва­ет, куда записывается результат:  в регистр (d=1)  или в ячейку памяти (d=0).  Трехбитовое поле reg второго байта  указывает  операнд-регистр (см. выше),  двухбитовое поле mod определяет, сколько байтов в команде занимает операнд-адрес  (00 - 0 байтов, 01 - 1 байт, 10 - 2 байта),  а трехбитовое поле mem указывает способ модификации этого адреса. В сле­дующей таблице указаны правила вычисления исполнительного адреса в за­висимости от значений полей mod и mem (a8 - адрес размером в байт, a16


- адрес размером в слово):

      mem \ mod |     00           01            10

------------------------------------------------------­000 |  [BX]+[SI] [BX]+[SI]+a8           [BX]+[SI]+a16

      001       |  [BX]+[DI]  [BX]+[DI]+a8  [BX]+[DI]+a16

      010       |  [BP]+[SI]  [BP]+[SI]+a8  [BP]+[SI]+a16

      011       |  [BP]+[DI]  [BP]+[DI]+a8  [BP]+[DI]+a16

      100       |  [SI]       [SI]+a8       [SI]+a16


      101       |  [DI]       [DI]+a8       [DI]+a16

      110       |  a16        [BP]+a8       [BP]+a16

      111       |  [BX]       [BX]+a8       [BX]+a16


    Замечания. Если в команде не задан адрес, то он считается нулевым. Если адрес задан в виде байта (a8), то он автоматически расширяется со знаком до слова (a16). Случай mod=00 и mem=110 указывает на отсутствие регистров-модификаторов, при этом адрес должет иметь размер слова (ад­ресное выражение [BP] ассемблер транслирует в  mod=01  и  mem=110  при a8=0). Случай mod=11 соответствует формату "регистр-регистр".

3) Формат "регистр-непосредственный операнд" (3-4 байта): -----------  -------------  --------------------------

| КОП |s|w|  |11|КОП"|reg|  |непосред.операнд (1-2 б)|

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

Команды этого формата описывают операции  reg:=reg_immed  (immed - не­посредственный операнд).  Бит w указывает на размер операндов,  а поле reg - на регистр-операнд (см. выше). Поле КОП в первом байте определя­ет лишь класс операции (например, класс сложения),  уточняет же опера­цию поле КОП" из второго байта.  Непосредственный операнд  может зани­мать 1 или 2 байта - в зависимости от значения бита w,  при этом  опе­ранд-слово записывается в команде в "перевернутом" виде. Ради экономии памяти в ПК предусмотрен случай,  когда в операции над словами  непос­редственный операнд может быть задан байтом  (на этот случай указывает 1 в бите s при w=1), и тогда перед выполнением операции байт автомати­чески расширяется (со знаком) до слова.

4) Формат "память-непосредственный операнд" (3-6 байтов): -----------  --------------  --------------  ------------------

| КОП |s|w|  |mod|КОП"|mem|  |адрес (0-2б)|  |непоср.оп (1-2б)|

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

Команды этого формата  описывают операции типа  mem:=mem_immed.  Смысл всех полей - тот же, что и в предыдущих форматах.

    Помимо рассмотренных  в ПК используются и другие форматы команды с двумя операндами;  так,  предусмотрен  специальный формат  для команд, один из операндов которых  фиксирован (обычно  это регистр AX).  Имеют свои форматы и команды с другим числом операндов.

         1.3.3  Запись команд в MASM

    Из сказанного ясно, что одна и та же операция в зависимости от ти­пов операдов записывается в виде различных машинных команд:  например, в ПК     имеется 28 команд пересылки байтов и слов.  В то же время в MASM

все эти "родственные" команды записываются единообразно: например, все команды пересылки имеют одну и ту же символьную форму записи:

         MOV op1,op2     (op1:=op2)

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

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

         метка:  мнемокод  операнды   ;комментарий

Метка с двоеточием, а также точка с запятой и комментарий могут отсут­ствовать. Метка играет роль имени команды, ее можно использовать в ко­мандах перехода на данную команду.  Комментарий не влияет на смысл ко­манды, а лишь поясняет ее.

Мнемонические названия операций полностью перечислены в главе 2. Операнды, если есть, перечисляются через запятую. Основные правила

записи операндов следующие.

    Регистры указываются своими именами, например:

         MOV AX,SI      ;оба операнда - регистры

    Непосредственные операнды  задаются  константными выражениями  (их значениями являются константы-числа), например:

         MOV BH,5      ;5 - непосредственный операнд

MOV DI,SIZE X  ;SIZE X (число байтов, занимаемых перемен­;ной X) - непосредственный операнд

    Адреса описываются адресными выражениями  (например, именами пере­менных),  которые могут быть модифицированы по одному или двум регист­рам; например, в следующих командах первые операнды задают адреса:

         MOV X,AH

         MOV X[BX][DI],5

         MOV [BX],CL

    При записи команд в символьной форме  необходимо  внимательно сле­дить за правильным указанием типа (размера) операндов,  чтобы  не было ошибок. Тип обычно определяется по внешнему виду одного из них, напри­мер:

         MOV AH,5   ;пересылка байта, т.к. AH - байтовый регистр

         MOV AX,5   ;пересылка слова, т.к. AX - 16-битовый регистр

;(операнд 5 может быть байтом и словом, по нему ;нельзя определить размер пересылаемой величины)

MOV [BX],300  ;пересылка слова, т.к. число 300 не может быть ;байтом

    Если по внешнему виду  можно однозначно  определить тип обоих опе­рандов,  тогда эти типы должны совпадать,  иначе ассемблер зафиксирует ошибку. Примеры:

         MOV DS,AX   ;оба операнда имеют размер слова

         MOV CX,BH   ;ошибка: регистры CX и BH имеют разные размеры

MOV DL,300  ;ошибка: DL - байтовый регистр, а число 300 не ;может быть байтом

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

         MOV [BX],5

Здесь  число 5  может быть и байтом, и словом,  а адрес из регистра BX может указывать и на байт памяти, и на слово. В подобных ситуациях ас­семблер фиксирует ошибку.  Чтобы избежать ее, надо уточнить тип одного из операндов с помощью оператора с названием PTR:

         MOV BYTE PTR [BX],5  ;пересылка байта

         MOV WORD PTR [BX],5  ;пересылка слова

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

    Оператор PTR  необходим и в том случае,  когда надо изменить  тип, предписанный имени при его описании. Если, например, X описано как имя переменной размером в слово:

          X DW 999

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

          MOV AH,X

нельзя, т.к. ее операнды имеют разный размер.  Эту команду следует за­писать несколько иначе:

          MOV AH,BYTE PTR X

Здесь конструкция BYTE PTR X  означает адрес X, но уже рассматриваемый не как адрес слова, а как адрес байта.  (Напомним, что с одного и того же адреса    может начинаться байт, слово и двойное слово

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


Copyright © 2005—2007 «RefStore.Ru»