Директива 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. это же касается и макрокоманд. < смещение> - смещение в байтах текущей команды относительно начала сегмента кода. Это смещение называют также счетчиком адреса. Величину смещения вычисляет транслятор для адресации в сегменте кода. < машинный_код> - машинное представление команды ассемблера, представленной далее в этой строке полем < исходный_код>. < исходный_код> - строка кода из исходного файла.
Таким образом, исходный файл на ассемблере в общем случае может содержать конструкции следующих типов:
Воспользуйтесь поиском по сайту: ©2015 - 2025 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|