Ассемблер для процессоров Intel Pentium
Шрифт:
– DQ – распределение и инициализация 8 байт памяти для каждого из указанных значений. В качестве значения может кодироваться целое число, одно-или двухсимвольная константа, действительное число, кодированное действительное число, оператор DUP, абсолютное выражение, адресное выражение или знак ?. Знак ? обозначает неопределенное значение. Значения, если их несколько, должны разделяться запятыми. Если директива имеет имя, создается переменная типа QW0RD с соответствующим данному значению указателя позиции смещением. Строковая константа не может содержать более двух символов. Последний (или единственный) символ строки
– DT – распределение и инициализация 10 байт памяти для каждого из указанных значений. В качестве значения может кодироваться целое выражение, упакованное десятичное число, одно– или двухсимвольная константа, кодированное действительное число, оператор DUP или знак ?. Знак ? обозначает неопределенное значение. Значения, если их несколько, должны разделяться запятыми. Если директива имеет имя, создается переменная типа TW0RD с соответствующим данному значению указателя позиции смещением. Строковая константа не может содержать более двух символов. Последний (или единственный) символ строки хранится в младшем байте слова. Второй байт содержит первый символ или, если строка односимвольная, ноль. Остальные байты заполняются нулями. При обработке директивы DT подразумевается, что константы, содержащие десятичные цифры, представляют собой не целые, а десятичные упакованные числа. Чтобы в случае необходимости определить 10-байтовое целое число, следует после числа указать спецификатор системы счисления (D или d для десятичных чисел, H или h для шестнадцатеричных и так далее). Если в одной директиве определения памяти заданы несколько значений, им распределяются последовательные байты памяти.
Во всех директивах определения памяти в качестве одного из значений может быть задан оператор DUP. Он имеет следующий формат:
счетчик DUP (значение, ...)
Указанный в скобках список значений повторяется многократно в соответствии со значением счетчика. Каждое значение в скобках может быть любым выражением, например целым числом, символьной константой или другим оператором DUP (допускается до 17 уровней вложенности операторов DUP). Значения, если их несколько, должны разделяться запятыми. Оператор DUP может использоваться не только в директивах определения памяти, но и в других директивах.
Далее приводятся примеры директив определения данных:
dbl DB 1
db2 DB 'ABCD'
db3 DB ?
dwl DW 9325
dw2 DW 4*3
dw3 DW 1,'$'
dw4 DW array
ddl DD 'xyz'
dd2 DD 1.5
dql DQ 18446744073709551615
mixl DB 5 DUP(5 DUP(5 DUP(IO)))
mix2 DW DUP(1,2,3,4,5)
Рассмотрим способы представления (кодировки) для различных типов данных. Вещественные числа (числа с плавающей точкой) кодируются с использованием одной из форм:
xxxx.xxxx[R]
[[+|-]]хххх.хххх[[Е[[+|-]]хххх];
Здесь х – одна из цифр от 0 до 9.
Кодированные вещественные числа могут использоваться в директивах DD, DQ и DT, например:
al DD 56.23R
а2 DD -45.6R
аЗ DD 211.77E-2
Десятичные числа кодируются так, как показано далее:
[[+|-]]хххх
Здесь х – одна из цифр от 0 до 9.
Следующий тип данных, который мы рассмотрим, – знаковые и строковые константы.
Они
`сссссс` «ссссс»
Здесь с – символы из допустимого диапазона.
Часть строки исходного текста после символа точки с запятой (если он не является элементом знаковой константы или строки знаков) считается комментарием и ассемблером игнорируется. Комментарии вносятся в программу как поясняющий текст и могут содержать любые знаки до ближайшей комбинации символов возврата каретки и перевода строки (CR/LF).
В языке ассемблера очень часто используются так называемые символические имена, которые существенно упрощают программирование. Описание символических имен выполняется с помощью специальных директив.
Символические имена могут представлять собой число, текст, инструкцию или адрес. Для описания символических имен в языке ассемблера служат директивы EQU, LABEL и директива присваивания =.
Директива присваивания имеет такой формат:
имя=выражение
При помощи этой директивы создается имя, представляющее собой значение, равное текущему значению указанного выражения. Для хранения этого значения память не выделяется. Вместо этого каждое появление указанного имени в программном коде замещается значением выражения.
Символическое имя может быть переопределено. В каждой директиве присваивания в качестве имени может указываться уникальное имя или имя, ранее использованное другой директивой присваивания.
Выражение может быть целым числом, одно– или двухсимвольной строковой константой, константным или адресным выражением. Его значение не должно превышать 65 535.
Примеры определения символических имен:
int = 167
stringl = 'ab'
const = 7*4
addrl = stringl
Директива EQU имеет следующий формат:
имя EQU выражение
Директива EQU создает абсолютное имя, псевдоним или текстовое имя путем присваивания имени указанного выражения. Под абсолютным именем здесь подразумевается имя, представляющее собой 16-разрядное значение, а псевдонимом называется ссылка на другое имя. В качестве текстового имени может использоваться строка символов. При компиляции исходного текста каждое появление имени ассемблер замещает текстом или значением выражения, в зависимости от типа выражения. Имя должно быть уникальным и не может быть переопределено. В качестве выражения может задаваться целое число, строковая константа, вещественное число, кодированное вещественное число, мнемоника инструкции, константное или адресное выражение. Выражение, имеющее значением целое число, порождает имя, вхождения которого ассемблер замещает этим значением. Для всех остальных выражений вхождения имени замещаются текстом.
Примеры применения директивы EQU:
k EQU 1024
adr EQU [BP]
de EQU X0R АХ,АХ
cl EQU BYTE PTR
t EQU 'File'
MASM EQU 5.1 + 0.9
Msft EQU <Microsoft>
mat EQU 20*30
Директива LABEL имеет следующий формат:
имя LABEL тип
Директива LABEL порождает новую переменную или метку путем присваивания имени указанного типа и текущего значения указателя позиции. Имя должно быть уникальным и не может быть переопределено. В качестве типа может быть задано одно из следующих ключевых слов: BYTE, WORD, DWORD, QWORD, TBYTE, NEAR, FAR.