CodeNet / Языки программирования / Ассемблер / СПРАВОЧНИК по системе программирования ТУРБО АССЕМБЛЕР 2.0
СПРАВОЧНИК по системе программирования ТУРБО АССЕМБЛЕР 2.0
Выбор основания по умолчанию
-----------------------------------------------------------------
Чаще всего вы, вероятно, захотите использовать по умолчанию
десятичные значения, просто потому, что это наиболее знакомое
представление. Однако, иногда удобно использовать числа без суф-
фиксов, в которых по умолчанию используется другое основание. В
этом случае необходима директива .RADIX.
Директива .RADIX выбирает основание, которое будет по умол-
чанию использоваться для спецификации чисел. Например, директива:
.RADIX 16
в качестве используемого по умолчанию выбирает основание 16
(шестнадцатиричное). Действие директивы .RADIX показано в следую-
щем фрагменте программы:
.
.
.
.RADIX 16 ; выбрать в качестве используемо-
; го по умолчанию основание 16
mov ax,100 ; =100h или 256 в десятичном
; виде
.RADIX 10 ; выбрать в качестве используемо-
; го по умолчанию основание 10
sub ax,100 ; -100 в десятичном виде,
; результат равен 256-100=156
; в десятичном виде
.RADIX 2 ; выбрать по умолчанию основание
; 2 (двоичное)
add ax,100 ; +100b (4 в десятичном виде)
; результат = 156+4=160 (дес.)
.
.
.
С помощью директивы .RADIX можно выбрать основание 2, 8, 10
или 16. Операнд директивы .RADIX всегда указывается в десятичном
виде, независимо от того, какое основание выбрано по умолчанию.
Другими словами одна директива .RADIX не влияет на операнд следу-
ющей директивы .RADIX.
При использовании директивы .RADIX может возникнуть потенци-
альная проблема. Независимо от выбранного по умолчанию основания
системы счисления подразумевается, что значения, задаваемые в ди-
рективах DD, DQ или DT - это десятичные значения (если не исполь-
зуется суффикс). Это значит, что в директиве:
.
.
.
.RADIX 16
DD 1E7
.
.
.
1E будет равно 1 * 10 в седьмой степени, а не 1Eh. Фактически, на
практике всегда лучше указывать во всех шестнадцатиричных значе-
ниях суффикс h (даже после директивы .RADIX 16). Почему? Вспомни-
те о том, что b и d допускается использовать в качестве суффик-
сов, что определяет соответственно двоичное и шестнадцатиричное
представление. К сожалению, b и d могут также использоваться в
качестве шестнадцатиричных цифр. Если действует директива .RADIX
16, как Турбо Ассемблер будет воспринимать числа 129D и 101B?
В этом случае Турбо Ассемблер всегда обращает внимание на
допустимые суффиксы, поэтому 129D - это 129 в десятичном виде, а
101B - это 101 в двоичном виде (или 5 в десятичном). Это означа-
ет, что даже при действии директивы .RADIX 16 все шестнадцатирич-
ные числа, заканчивающиеся на b и d, должны иметь суффикс h. Учи-
тывая это, проще всего указывать этот суффикс во всех
шестнадцатиричных числах. Отсюда ясно, что пользы от директивы
.RADIX 16 мало.
Инициализированные данные
-----------------------------------------------------------------
Теперь мы готовы к тому, чтобы рассмотреть способы, с по-
мощью которых в Турбо Ассемблере можно определять переменные. Да-
вайте сначала рассмотрим определение инициализированных данных.
Директивы определения данных DS, DW, DD, DF, DP, DQ и DT
позволяют вам определить переменные в памяти различного размера:
DW 1 байт
DW 2 байта = 1 слово
DD 4 байта = 1 двойное слово
DF, DP 6 байт = 1 указатель дальнего типа (386)
DQ 8 байт = одно четверное слово
DT 10 байт
Например:
.
.
.
.DATA
ByteVar DB 'Z' ; 1 байт
WordVar DW 101b ; 2 байта (1 слово)
DwordVar DD 2BFh ; 4 байта (1 двойное слово)
QWordVar DQ 307o ; 8 байт (1 четверное слово)
TWordVar DT 100 ; 10 байт
.
.
.
mov ah,2 ; функция DOS вывода на
; дисплей
mov dl,[ByteVar] ; символ, который нужно
; вывести на экран
int 21h
.
.
.
add ax,[WordVar]
.
.
.
add WORD PTR [DwordVar],ax
adc WORD PTR [DwordVar+2],dx
.
.
.
Здесь определяются и используются пять переменных памяти и
показывается, как некоторые из таких переменных можно использо-
вать.
Инициализация массивов
-----------------------------------------------------------------
В одной директиве определения данных может указываться нес-
колько значений. Например, директива:
SampleArray DW 0, 1, 2, 3, 4
создает массив из пяти элементов с именем SampleArray, элементы
которого имеют размер в слово (см. Рис. 5.7). В директивах опре-
деления данных можно использовать любое число значений, умещающе-
еся на строке.
. .
. .
| |
|-----------|
| ? |
SampleArray -------------> |-----------|
| 0 |
|-----------|
| 1 |
|-----------|
| 2 |
|-----------|
| 3 |
|-----------|
| 4 |
|-----------|
| ? |
|-----------|
| |
. .
. .
Рис. 5.7 Пример массива из пяти элементов.
Как быть в том случае, если вы хотите определить массив, ко-
торый слишком велик и не может уместиться на одной строке? Для
этого просто нужно добавить несколько строк. Метку в директиве
определения данных указывать необязательно. Например, по директи-
вам:
.
.
.
SquareArray DD 0, 1, 4, 9, 16
DD 25, 36, 49, 64, 81
DD 100, 121, 144, 169, 196
.
.
.
создается массив элементов размером в двойное слово с именем
SquareArray, состоящий из квадратов первых 15 целых чисел.
Турбо Ассемблер позволяет вам определить блок памяти, иници-
ализированный указанным значением, с помощью операции DUP. Напри-
мер:
BlankArray DW 100h DUP (0)
Здесь создается массив BlankArray, состоящий из 255 (десят.)
слов, инициализированных значением 0. Аналогично, директива:
ArrayOfA DB 92 DUP ('A')
создает массив из 92 байт, каждый из которых инициализирован сим-
волом A.
