- •Министерство образования и науки
- •Теоретические сведения
- •1.1. Регистры
- •1.1.2. Регистры общего назначения
- •1.1.3. Сегментные регистры
- •1.2. Регистр флагов
- •1.3. Представление данных
- •1.3.1. Целые числа без знака
- •1.3.2. Целые числа со знаком
- •1.3.3. Представление символьных переменных
- •1.4. Лексемы
- •1.4.1. Идентификаторы
- •1.4.2. Целые числа
- •1.4.3. Символьные данные
- •1.5. Предложения
- •1.5.1. Комментарии
- •1.5.2. Команды
- •1.5.3. Директивы
- •1.6. Директивы определения данных
- •1.6.1. Директива db
- •1.6.2. Директива dw
- •1.6.3. Директива dd
- •1.6.4. Директивы эквивалентности и присваивания
- •1.7. Выражения
- •1.8. Обозначения
- •1.9. Команды пересылки
- •1.9.1. Команда mov
- •1.9.2. Команда xchg (exchange)
- •1.10. Команды сложения и вычитания
- •1.10.1. Особенности сложения и вычитания целых чисел в пк
- •1.10.2. Команды сложения и вычитания
- •Например: Mov ah, 1
- •1.11. Команды умножения и деления
- •1.11.1. Команды умножения
- •1.11.2. Команды деления
- •1.12. Изменение размеров числа
- •Задание
- •Контрольные вопросы
- •Литература
1.6.2. Директива dw
Директивой DW (defineword, определить слово) описываются переменные размером в слово. Она аналогична директиве DB, поэтому далее вкратце опишем ее использование.
Операнд ?
Пример:А DW ? (создается переменная А размером в слово).
В ЯА есть стандартная константа с именем Wordи значением 2. Поэтому Type A=Word=2.
Константное выражение со значением от –32768 до 65535
Пример : B DW 1234h
C DW -2
Как и в случае директивы DB, не отрицательные числа записываются в память как числа без знака, а отрицательные числа – в дополнительном коде.
В частном случае рассматриваемого вида операнды директивы DW может быть строка из одного или двух символов,
Например:
S1 DW ‘01’ или S2 DW ‘1’
Если указана строка из двух символов, тогда ЯА берет коды указанных символов (код ‘0’ – 30h и код ‘1’ – 31h) и образует из них число-слово (3031h). Если же указан один символ, тогда к нему слева приписывается символ с кодом 0, то есть S2 будет содержать начальное значение 0031h.
Несколько операндов, конструкция повторения.
В правой части директивы DW можно указать любое число операндов, а также конструкцию повторения.
Например:E DW 40000, 3 DUP (?)
1.6.3. Директива dd
По этой директиве (definedoubleword) описываются переменные, под которые отводятся двойные слова. Поэтому имена этих переменных имеют тип 4 илиDWord. В остальном эта директива похожа на DB и DW.
Операнд ?
Пример:A DD ?
Целое число со значением от – 231 до 232 - 1
Пример:B DD 123456h.
Константное выражение (со значением от –215 до 216 - 1)
Причина такого диапазона чисел в том, что в ЯА все выражения вычисляются в области 16-битовых чисел, то есть результаты всех операций берутся по модулю 216(10000h). Поэтому построить выражение, значением которого является 32-битовое или даже 17-битовое число, не удастся. Единственное исключение – это явно задать в директиве DD “большое” число. Если же мы укажем хотя бы одну операцию, то ответ тут же будет взят по модулю 216.
Например:
по директиве X D 8000h+8002h
Начальным значением переменной Х станет число 2, а не число 10002h.
Несколько операндов, конструкция повторения.
Например: X DW 33 DUP (?) , 123456h.
1.6.4. Директивы эквивалентности и присваивания
Директива EQU (equal, равно) применяется в ЯА для описания констант.
Синтаксис:<имя> EQU <операнд>
После описания константы при последующих встречах этой константы в тексте программы при компиляции будет заменяться на операнд.
Например, эти директивы эквивалентны:
A EQU ‘*’ T DB ‘*’
T DB A
Рассмотрим возможные операнды директивы EQU.
Операнд-имя
Если в правой части директивы указано имя регистра, переменной, константы и т. п., тогда имя слева объявляется синонимомданного имени и все последующие вхождения в текст программы этого имени-синонима ассемблер будет заменять на имя, указанное справа.
Например: A DW ?
B EQU A
C DW B ; эквивалентно C DW A
Имена-синонимы используются для наглядных обозначений. Например, как имя-синоним регистра.
Операнд - константное выражение
Примеры: N EQU 100
K EQU 2*N-1
B EQU ‘*’
В этом случае значением константы объявляется значение выражения, на которое оно будет заменяться при компиляции.
Если в константном выражении используется имена других констант, то они должны быть описаны выше данной директивы EQU.
Операнд - любой другой текст
Пример:S EQU ‘Вы ошиблись’
LX EQU X+(N-1)
В данном случае считается, что указанное имя обозначает операнд в том виде, как он записан (операнд не вычисляется). Именно на этот текст будет замещаться каждое вхождение данного имени в программу.
Например, следующие предложения эквивалентны:
ANS DB S, ‘!’ ANS DB ‘Вы ошиблись’, ‘!’
NEG LX NEG X+(N-1)
Еще одна директива ЯА, похожая на EQU
Директива присваивания:
<имя>=<константное выражение>.
Это выражение определяет константу с именем, указанным в левой части, и числовымзначением, равным значению выражения справа. В отличие от констант, описанных по директиве EQU, данная константа может менять свое значение, обозначая в разных частях текста программы разные числа.
Например:
K=10
A DW K ; A DW 10
K=K+4
B DW K ; B DW 14
По окончании – 2 характерных примера:
-
K=1
N EQU K
A DW N ; A=1
K=2
B DW N ; B=2
K=1
N EQU K+10
C DW N ; C=11
K=2
D DW N ; D=11
Имя N – синоним K, поэтому
А DW N эквивалентно
A DW K
В этом случае N сразу вычислится и не будет зависеть от К