Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Директива LABEL. M_AX  LABEL  WORD.   mov  m_ax, 0 ; засылка 0 в слово m_ax.   mov  m_al, 3 ; засылка 3 в байт m_al. Явное присваивание значений меткам – директива EQU




Директива LABEL

(слайд №26-27)

 

Директива LABEL определяет метку и задает ее тип. Тип может быть одним из:

· BYTE (байт),

· WORD (слово),

· DWORD (двойное слово),

· FWORD (6 байт),

· QWORD (учетверенное слово),

· TBYTE (10 байт),

· NEAR (ближняя метка),

· FAR (дальняя метка).

Метка получает значение, равное адресу следующей команды или следующих данных, и тип, указанный явно. В зависимости от типа команда

mov   метка, 0

запишет в память байт (слово, двойное слово и т. д. ), заполненный нулями, а команда

call     метка

выполнит ближний или дальний вызов подпрограммы.

       С помощью директивы LABEL удобно организовывать доступ к одним и тем же данным, как к байтам, так и к словам, определив перед данными две метки с разными типами.

Синтаксис:

метка label тип

 

Например, моделирование AX=< AH, AL>:

M_AX         LABEL  WORD

M_AL DB  ?

M_AH         DB?

       mov           m_ax, 0; засылка 0 в слово m_ax

       mov           m_al, 3; засылка 3 в байт m_al

Явное присваивание значений меткам – директива EQU

(слайд №28)

 

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

 

метка equ    выражение Пример: truth  equ    1message1          equ    'Try again$'var2   equ    4[si]…cmp   ax, truth; cmp ax, 1…db      message1         ; db 'Try again$'…mov   ax, var2; mov ax, 4[si]

       Директива EQU чаще всего используется с целью введения параметров, общих для всей программы, аналогично команде #define препроцессора языка С.

Директива =

(слайд №29)

 

       Директива = эквивалентна EQU, но определяемая ею метка может принимать только целочисленные значения. Кроме того, метка, указанная этой директивой, может быть переопределена.

 

метка          =              выражение

 

       Каждый ассемблер предлагает целый набор специальных предопределенных меток — это может быть текущая дата (@date или?? date), тип процессора (@cpu) или имя того или иного сегмента программы, но единственная предопределенная метка, поддерживаемая всеми рассматриваемыми нами ассемблерами, — $. Она всегда соответствует текущему адресу. Например, команда

 

jmp $

выполняет безусловный переход на саму себя, так что создается вечный цикл из одной команды.

 

Таким образом, общий формат строки ассемблер-программы:

(слайд №30)

 

[< метка> [: ]][< оператор> [< операнд1> ][, операнд2]][; комментарий]

 

Операторы:

1. Арифметические: +, -, *, /, MOD

2. Логические и сдвиговые: AND, NOT, OR, XOR, SHL, SHR

3. Сравнение: EQ, GE, GT, LE, LT, NE

4. Выделение подвыражения: ()

5. Строковая константа: < >

 


Страница 11 «6 Листинг»

Формат строки листинга

(слайд №31)

 

< глубина> < номер_строки> < смещение> < машинный_код> < исходный_код>

 

Пример:

 

8     0000                                             . MODEL    SMALL

9     0000                                             . STACK     200h

10                                                            . 386

11                                                            . LOCALS

12             ; Объявление данных

13   0000                                             . DATA

14             ; char *txt[]= {" Иванов И. И. ", " ООО \" СОМ\" ", " Ведущий программист", NULL};

       15   0000 0008r 0014r 001Er+        TXT DW S1, S2, S3, 0

       16   0000

       17   0008 88 A2 A0 AD AE A2 20+ S1   DB 'Иванов И. И. ', 0

       18   88 2E 88 2E 00

       19   0014 8E 8E 8E 20 22 91 8E+    S2   DB 'ООО " СОМ" ', 0

       20   8C 22 00

       21   001E 82 A5 A4 E3 E9 A8 A9+  S3   DB 'Ведущий программист', 0

       22   20 AF         E0 AE A3 E0 A0+

       23   AC AC       A8 E1 E2 00

       24

       25   0032                                             . CODE

26; Макрос вывода символа DL на экран

27; Отмена вставки макроопределения \

       27                                                             PUTC MACRO    CHAR

       28                                                             IFNB < CHAR>

       29                                                             MOV DL, CHAR

       30                                                             ENDIF

       31                                                             MOV AH, 2

       32                                                             INT 21h

       33                                                         ENDM

       34

       35                         ; ============== Программа ===================

       36   0000                                             . CODE

       37

       38   00               00                          BEGIN:      ; инициализация сегментного регистра

       39   0000 B8 0000s                             MOV AX, @DATA

       40   0003 8E D8                                  MOV DS, AX

       41                                                            ; инициализация задержки

       42                                                            ; s = txt;

       43   0005 BE 0000r                             LEA SI, TXT; Замена 8D-> BE

       44   0008                                              @@L: ; while(*s! = NULL) {

       45   0008 83 3C 00                                      CMP WORD PTR [SI], 0

       46   000B 74 0C 90 90                     JE @@R

       47                                                            ; puts(*s)

       48   000F 8B 3C                                  MOV DI, [SI]

       49   0011 E8 000B                              CALL  PUTS

       50                                                             ; s++ }

       51   0014 83 C6 02                          ADD SI, 2

       52   0017 EB EF                                  JMP SHORT @@L

       53   0019                                              @@R: ; return(0);

       54   0019 B4 4C                                  MOV AH, 4Ch

       55   001B B0 00                                  MOV AL, 0

       56   001D CD 21                                 INT 21h

… и т. д.

 

< глубина> - уровень вложенности включаемых файлов или макрокоманд файла.

< номер_строки> - номер строки в файле листинга. Эти номера используются для локализации ошибок и формирования таблицы перекрестных ссылок. Эти номера могут не соответствовать номерам строк в исходном файле. Кроме того, ассемблер имеет директиву INCLUDE, которая позволяет включить в данный файл строки другого файла. Нумерация при этом, как и в случае макрокоманд, будет последовательная для строк обоих файлов. Факт вложенности кода одного файла в другой фиксируется увеличением значения < глубина> (глубина вложенности) на 1. это же касается и макрокоманд.

< смещение> - смещение в байтах текущей команды относительно начала сегмента кода. Это смещение называют также счетчиком адреса. Величину смещения вычисляет транслятор для адресации в сегменте кода.

< машинный_код> - машинное представление команды ассемблера, представленной далее в этой строке полем < исходный_код>.

< исходный_код> - строка кода из исходного файла.

 

       Таким образом, исходный файл на ассемблере в общем случае может содержать конструкции следующих типов:

  1. команда ассемблера – конструкции, которым соответствуют машинные команды;
  2. директивы ассемблера – конструкции, которые не генерируют машинных команд, а являются указаниями транслятору на выполнение некоторых действий или служат для задания режима работы;
  3. макрокоманды – конструкции, которые, будучи представлены одной строкой в исходном файле программы, после обработки транслятором генерируют в объектном модуле последовательность команд, директив или макрокоманд ассемблера.

 


Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...