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.