Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 29
Unknown Author
A DW $
Чаще всего счетчик размещения используется для вычисления размера памяти, занимаемой каким-то массивом, например:
X DW 40 DUP(?)
SIZE_X EQU $-Х ; SIZE_X = 80
Здесь $ обозначает адрес первого байта за массивом X, из этого адреса и вычитается начальный адрес массива.
Среди операторов, значением которых являются адреса, пока отметим лишь операторы сложения и вычитания (а - адресное выражение, к - константное):
• сложение адреса с числом: а+k, к+а (значением такого выражения является адрес, полученный прибавлением к адресу а числа к).
• вычитание константы из адреса: а-k (значением является адрес а, уменьшенный на величину к).
Адресные выражения вида <имя>±<пелое> используются для ссылок на безымянные ячейки памяти (как правило, элементов массивов). Например, если имеются описания
A DB 0,1,2,3 В DB 4
то именованными оказываются только байты со значениями 0 и 4, а остальные элементы массива А оказываются безымянными, поэтому к ним нельзя обратиться по имени. Для доступа к таким безымянным ячейкам в ЯА и используются адресные выражения указанного вида. Например, сослаться на байт со значением 3 можно с помощью выражения А+3 или В-1.
Отметим, что в ЯА запрещено вычитание адреса из числа, не допускается сложение, умножение и деление адресов - все это бессмысленные операции. Однако допускается вычитание адресов, но в этом случае, как мы уже знаем, результатом будет не адрес, а константа.
И еще одно замечание. В ЯА указывать адреса в явном, цифровом, виде нельзя. Если указано число, то оно всегда воспринимается как константа, а не адрес. Если же все-таки надо указать адрес в явном виде, то это делается специальным образом, о чем будет рассказано в гл. 7.
ПЕРЕСЫЛКИ. АРИФМЕТИЧЕСКИЕ КОМАНДЫ
Мы переходим к изучению команд ПК и способов их записи в ЯА. В данной главе будут рассмотрены команды пересылки и арифметические команды.
3.1. Обозначение операндов команд
При описании команд нам придется указывать, какие операнды в них допустимы, а какие - нет. Для сокращения подобного рода указаний мы введем сейчас обозначения, которыми затем будем пользоваться при описании команд.
в команде
i8, il6, i32
константное выражение
в регистре общего назначения
r8, rl6
имя регистра
в сегментном регистре
sr
CS, DS, SS, ES
в ячейке памяти
m8, ml6, m32
адресное выражение
Непосредственные операнды (т. е. задаваемые в самой команде) мы будем обозначать буквой i (от immediate, непосредственный), указывая за ней, сколько разрядов - 8 (байт), 16 (слово) или 32 (двойное слово) - отводится на него в команде. При этом отметим: запись il6 не означает, что операнд не может быть небольшим числом, в качестве il6 можно указать и операнд 0, и операнд 32000, лишь бы он занимал не более 16 разрядов. В ЯА непосредственные операнды записываются в виде константных выражений.
Регистры будем обозначать буквой г (от register), указывая за ней требуемый размер регистра: г8 - это байтовые регистры (АН, AL, ВН и т. п.), а г16 - регистры размером в слово (АХ, ВХ, SI и т. п.). При этом буквой г мы обозначаем только регистры общего назначения, сегментные же регистры мы будем обозначать как sr.