FLD1DT . . . . . . . . . L TBYTE 007A DATASG
FLD1DW . . . . . . . . . L WORD 0030 DATASG
FLD2DB . . . . . . . . . L BYTE 0001 DATASG
FLD2DD . . . . . . . . . L DWORD 004E DATASG
FLD2DQ . . . . . . . . . L QWORD 006A DATASG
FLD2DT . . . . . . . . . L TBYTE 0084 DATASG
FLD2DW . . . . . . . . . L WORD 0032 DATASG
FLD3DB . . . . . . . . . L BYTE 0012 DATASG
FLD3DD . . . . . . . . . L DWORD 0052 DATASG
FLD3DQ . . . . . . . . . L QWORD 0072 DATASG
FLD3DW . . . . . . . . . L WORD 0034 DATASG
FLD4DB . . . . . . . . . L BYTE 0013 DATASG
FLD4DD . . . . . . . . . L DWORD 0056 DATASG
FLD4DW . . . . . . . . . L WORD 0036 DATASG
FLD5DB . . . . . . . . . L BYTE 0014 DATASG
FLD5DD . . . . . . . . . L DWORD 005A DATASG
FLD5DW . . . . . . . . . L WORD 0040 DATASG Length =0005
FLD6DB . . . . . . . . . L BYTE 0015 DATASG
FLD7DB . . . . . . . . . L BYTE 0021 DATASG
FLD8DB . . . . . . . . . L BYTE 0026 DATASG Length =000A
__________________________________________________________________________
Рис.5.1. Определение символьных строк и числовых величин.
Числовые константы
--------------------
Числовые константы используются для арифметических величин и для
aдресов памяти. Для описания константы кавычки не ставятся. Ассемблер
преобразует все числовые константы в шестнадцатеричные и записывает байты
в объектном коде в обратной последовательности - справа налево. Ниже
показаны различные числовые форматы.
Д е с я т и ч н ы й ф о р м а т. Десятичный формат допускает
десятичные цифры от 0 до 9 и обозначается последней буквой D, которую
можно не указывать, например, 125 или 125D. Несмотря на то, что ассемблер
позволяет кодирование в десятичном формате, он преобразует эти значения в
шест. объектный код. Например, десятичное число 125 преобразуется в шест.
7D.
Ш е с т н а д ц а т и р и ч н ы й ф о р м а т. Шестнадцатиричный
формат допускает шест. цифры от 0 до F и обозначается последней буквой H.
Так как ассемблер полагает, что с буквы начинаются идентификаторы, то
первой цифрой шест. константы должна быть цифра от 0 до 9. Например, 2EH
или 0FFFH, которые ассемблер преобразует соответственно в 2E и FF0F (байты
во втором примере записываются в объектный код в обратной
последовательности).
Д в о и ч н ы й ф о р м а т. Двоичный формат допускает двоичные
цифры 0 и 1 и обозначается последней буквой B. Двоичный формат обычно
используется для более четкого представления битовых значений в логических
командах AND, OR, XOR и TEST. Десятичное 12, шест. C и двоичное 1100B все
генерируют один и тот же код: шест. 0C или двоичное 0000 1100 в
зависимости от того, как вы рассматриваете содержимое байта.
В о с ь м е р и ч н ы й ф о р м а т. Восьмеричный формат допускает
восьмеричные цифры от 0 до 7 и обозначается последней буквой Q или O,
например, 253Q. На сегодня восьмеричный формат используется весьма редко.
Д е с я т и ч н ы й ф о р м а т с п л а в а ю щ е й т о ч к о й.
Этот формат поддерживается только ассемблером МASM.
При записи символьных и числовых констант следует помнить, что,
например, символьная константа, определенная как DB '12', представляет
символы ASCII и генерирует шест.3132, а числовая константа, oпределенная
как DB 12, представляет двоичное число и генерирует шест.0C.
Рис.5.1 иллюстрирует директивы для определения различных символьных
строк и числовых констант. Сегмент данных был ассемблирован для того,
чтобы показать сгенерированный объектный код (слева).
ДИРЕКТИВА ОПРЕДЕЛЕНИЯ БАЙТА (DB)
________________________________________________________________
Из различных директив, определяющих элементы данных, наиболее
полезной является DB (определить байт). Символьное выражение в диpективе
DB может содержать строку символов любой длины, вплоть до конца строки
(см. FLD2DB и FLD7DB на рис.5.1). Обратите внимание, что константа FLD2DB
содержит символьную строку 'Personal Computer'. Объектный код показывает
символы кода ASCII для каждого байта. Шест.20 представляет символ пробела.
Числовое выражение в директиве DB может содержать одну или более
однобайтовых констант. Один байт выражается двумя шест. цифpами.
Наибольшее положительное шест. число в одном байте это 7F, все "большие"
числа от 80 до FF представляют отрицательные значения. В десятичном
исчислении эти пределы выражаются числами +127 и -128.
В примере на рис.5.1 числовыми константами являются FLD3DB, FLD4DB,
FLD5DB и FLD8DB. Поле FLD6DB представляет смесь из числовых и строковых
констант, используемых для построения таблицы.
ДИРЕКТИВА ОПРЕДЕЛЕНИЯ СЛОВА (DW)
________________________________________________________________
Директива DW определяет элементы, которые имеют длину в одно слово
(два байта). Символьное выражение в DW ограничено двумя символами, которые
ассемблер представляет в объектном коде так, что, например, 'PC'
становится 'CP'. Для определения символьных строк директива DW имеет
ограниченное применение.
Числовое выражение в DW может содержать одно или более двухбайтовых
констант. Два байта представляются четырьмя шест. цифрами. Наибольшее
положительное шест. число в двух байтах это 7FFF; все "большие" числа от
8000 до FFFF представляют отрицательные значения. В десятичном исчислении
эти пределы выражаются числами +32767 и -32768.
В примере на рис.5.1 поля FLD1DW и FLD2DW определяют числовые
константы. Поле FLD3DW определяет адрес - в данном случае смещение на
адрес FLD7DB. В результате генерируется объектный код 0021 (R обозначает
перемещаемость). Проверяя выше по рисунку, видно, что относительный адрес
поля FLD7DB действительно 0021.
Поле FLD4DW определяет таблицу из пяти числовых констант. Заметим,
что объектный код для каждой константы имеет длину в oдно слово (два
байта).
Для форматов директив DW, DD и DQ ассемблер преобразует константы в
шест. объектный код, но записывает его в обратной последовательности.
Таким образом десятичное значение 12345 преобразуется в шест.3039, но
записывается в объектном коде как 3930.
ДИРЕКТИВА ОПРЕДЕЛЕНИЯ ДВОЙНОГО СЛОВА (DD)
________________________________________________________________
Директива DD определяет элементы, которые имеют длину в два cлова
(четыре байта). Числовое выражение может содержать одну или более
констант, каждая из которых имеет максимум четыре байта (восемь шест.
цифр). Наибольшее положительное шест. число в четырех байтах это 7FFFFFFF;
все "большие" числа от 80000000 до FFFFFFFF представляют отрицательные
значения. В десятичном исчислении эти пределы выражаются числами
+2147483647 и -2147483648.
В примере на рис.5.1 поле FLD3DD определяет числовую константу. В
поле FLD4DD генерируется разница между двумя адресами, в данном случае
результатом является длина поля FLD2DB. Поле FLD5DD определяет две
числовые константы.
Ассемблер преобразует все числовые константы в директиве DD в шест.
представление, но записывает объектный код в обратной последовательности.
Таким образом десятичное значение 12345 преобразуется в шест.00003039, но
записывается в oбъектном коде как 39300000.
Символьное выражение директивы DD ограничено двумя символами.
Ассемблер преобразует символы и выравнивает их слева в четырехбайтовом
двойном слове, как показано в поле FLD2DD в объектном коде.
ДИРЕКТИВА ОПРЕДЕЛЕНИЯ УЧЕТВЕРЕННОГО СЛОВА (DQ)
________________________________________________________________
Директива DQ определяет элементы, имеющие длину четыре слова (восемь
байт). Числовое выражение может содержать одну или более констант, каждая
из которых имеет максимум восемь байт или 16 шест. цифр. Наибольшее
положительное шест. число - это семерка и 15 цифр F. Для получения
представления о величине этого числа, покажем, что шест. 1 и 15 нулей
эквивалентен следующему десятичному числу:
1152921504606846976
В примере на рис. 5.1 поля FLD2DQ и FLD3DQ иллюстрируют числовые
значения. Ассемблер преобразует все числовые константы в директиве DQ в
шест. представление, но записывает объектный код в обратной
последовательности, как и в директивах DD и DW.
Обработка ассемблером символьных строк в директиве DQ aналогично
директивам DD и DW.
ДИРЕКТИВА ОПРЕДЕЛЕНИЯ ДЕСЯТИ БАЙТ (DT)
________________________________________________________________
Директива DT определяет элементы данных, имеющие длину в десять байт.
Назначение этой директивы связано с "упакованными десятичными" числовыми
величинами (см. гл.13). По директиве DT генерируются различные константы,
в зависимости от версии ассемблера; для практического применения
ознакомьтесь с руководством по вашему aссемблера.
На рис.5.1 приведены примеры директивы DT для неопределенного
элемента и для двухсимвольной константы.
Программа на рис.5.1 содержит только сегмент данных. Xотя асcемблер
не выдает сообщений об ошибках, в таблице LINK MAP появится
предупреждение: "Warning: No STACK Segment" (Предупреждение: не определен
сегмент стека), а компоновщик LINK выдаст "There were 1 errors detected"
(Обнаружена 1 ошибка). Несмотря на это предупреждение можно использовать
отладчик DEBUG для просмотра объектного кода, как показано на рис.5.2.
__________________________________________________________________________
D:\ D>DEBUG D:EXDEF.EXE
-D
1421:0000 00 50 65 72 73 6F 6E 61-6C 20 43 6F 6D 70 75 74 .Personal Comput
1421:0010 65 72 20 20 59 01 4A 41-4E 02 46 45 42 03 4D 41 .er Y.JAN.FEB.MA
1421:0020 52 33 32 36 35 34 00 00-00 00 00 00 00 00 00 00 R32654..........
1421:0030 F0 FF 59 00 21 00 03 00-04 00 07 00 08 00 09 00 ..Y.!...........
1421:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 43 50 ..............CP
1421:0050 00 00 3C 7F 00 00 11 00-00 00 0E 00 00 00 31 00 ..<...........1.
1421:0060 00 00 00 00 00 00 00 00-00 00 47 4D 00 00 00 00 ..........GM....
1421:0070 00 00 3C 7F 00 00 00 00-00 00 00 00 00 00 00 00 ..<.............
-D
1421:0080 00 00 00 00 43 50 00 00-00 00 00 00 00 00 33 33 ....CP........33
1421:0090 3E 36 33 33 73 00 00 00-0A 0E 00 00 3E 63 63 30 >633s.......>cc0
1421:00A0 1C 06 63 63 3E 00 00 00-0A 0E 00 00 FF DB 99 18 ..cc>...........
1421:00B0 18 18 18 18 3C 00 00 00-0A 0E 00 00 63 63 63 63 ....<.......cccc
1421:00C0 63 63 63 63 3E 00 00 00-0A 0E 00 00 C3 C3 C3 C3 cccc>...........
1421:00D0 C3 C3 66 3C 18 00 00 00-0A 0E 00 00 C3 C3 C3 C3 ..f<............
1421:00E0 DB DB FF 66 66 00 00 00-0A 0E 00 00 C3 C3 66 3C ...ff.........f<
1421:00F0 18 3C 66 C3 C3 00 00 00-0A 0E 00 00 C3 C3 C3 66 .