assembler. Учебник для вузов_Юров В.И_2003 -637с (862834), страница 20
Текст из файла (страница 20)
Синтаксис ассемблераЦелые числа могут указываться в двоичной, десятичной или шестнадцатеричной системах счисления. Отождествление чисел при записи их в программах наассемблере производится по определенным правилам. Десятичные числа не требуют для своего отождествления указания каких-либо дополнительных символов.Для отождествления в исходном тексте программы двоичных и шестнадцатеричных чисел используются следующие правила:<шестнадц_число> =» <дес_шестнадц_число>М | 0<сим_шестнадц_число>Ь<дес_шестнадц_число> =» <decdigi 1><сим_шестнадц_число> | <decdigi t><сим_шестнадц_число> =><hexdigi 1><сим_шестнадц_число>| <дес_шестнадц_число> | <decdigi t> | <hexdigi t><decdigit> => 0| 1 12 | 3|4|5 |6| 7|8|9<hexdigit> = > a | b | c | d | e | f | A | B | C | D | E | FВажно отметить наличие символов после (h) и перед (0) записью шестнадцатеричного числа.
Это сделано для того, чтобы транслятор мог отличить в программеодинаковые по форме записи десятичные и шестнадцатеричные числа. К примеру,числа 1578 и 1578h выглядят одинаково, но имеют разные значения. С другой стороны, какое значение в тексте исходной программы может иметь лексема fe023?Это может быть и некоторый идентификатор, и, судя по набору символов, шестнадцатеричное число. Для того чтобы однозначно описать в тексте программы наассемблере шестнадцатеричное число, начинающееся с буквы, его дополняют ведущим нулем «О» и в конце ставят символ «h». Для данного примера правильнаязапись шестнадцатеричного числа — Ofe023h:<двоичн_число> => <bindigi t>b| <bindigi 1><двоичн_число>Ь<bindigit> => 0|1Для двоичных чисел все просто — после записи нулей и единиц, входящих в ихсостав, необходимо поставить латинскую букву «Ь». Пример:Рассуждениями, приведенными ранее, был показан порядок формированияпредложений программы ассемблера и составляющих их элементов (лексем).
Также были рассмотрены правила формирования меток, названий команд (префиксов). Осталось обсудить комментарии и операнды. Что касается комментария, тоэто самый простой элемент предложения ассемблера. Любая комбинация символов ASCII, расположенная в строке за символом точки с запятой (;), трансляторомигнорируется, то есть является комментарием (см. рис. 5.1-5.3). Описанию операндов, ввиду их важности, будет посвящен отдельный подраздел.ОперандыОперанды — это объекты, над которыми или при помощи которых выполняютсядействия, задаваемые инструкциями или директивами.
Машинные команды могут либо совсем не иметь операндов, либо иметь один или два операнда. Большинство команд требует двух операндов, один из которых является источником, а другой — приемником (операндом назначения). В двухоперандной машинной командевозможны следующие сочетания операндов:в регистр — регистр;ii регистр — память;в память — регистр;Синтаксис ассемблера91* непосредственный операнд — регистр;» непосредственный операнд — память.Здесь важно подчеркнуть, что один операнд может располагаться в регистреили памяти, а второй операнд обязательно должен находиться в регистре или непосредственно в команде. Непосредственный операнд может быть только источником.Для приведенных ранее правил сочетания типов операндов есть исключения,которые касаются:к команд работы с цепочками, которые могут перемещать данные из памятив память;<1 команд работы со стеком, которые могут переносить данные из памяти в стек,также находящийся в памяти;II команд типа умножения, которые, кроме операнда, указанного в команде, неявно используют еще и второй операнд.Операндами могут быть числа, регистры, ячейки памяти, символьные идентификаторы.
При необходимости для расчета некоторого значения или определенияячейки памяти, на которую будет воздействовать данная команда или директива,используются выражения, то есть комбинации чисел, регистров, ячеек памяти,идентификаторов с арифметическими, логическими, побитовыми и атрибутивными операторами.Рассмотрим классификацию операндов, поддерживаемых транслятором ассемблера.в Операнд задается неявно на микропрограммном уровне.
В этом случае командаявно не содержит операндов. Алгоритм выполнения команды использует некоторые объекты по умолчанию (регистры, флаги в EFLAGS и т. д.). Например,команды CLI и STI неявно работают с флагом прерывания IF в регистре EFLAGS,а команда XLAT неявно обращается к регистру AL и строке в памяти по адресу,определяемому парой регистров DS:BX.к Операнд задается в самой команде (непосредственный операнд). Это может бытьчисло, строка, имя или выражение, имеющее некоторое фиксированное (константное) значение.
Физически непосредственный операнд находится в кодекоманды, то есть является ее частью. Для его хранения в команде выделяетсяполе длиной до 32 битов (см. главу 3). Непосредственный операнд может бытьтолько вторым операндом (источником). Операнд-приемник может находиться либо в памяти, либо в регистре. Например, команда mov ax,0ffffh пересылаетв регистр АХ шестнадцатеричную константу Offffh. Команда add sum,2 складывает содержимое поля по адресу sum с целым числом 2 и записывает результат поместу первого операнда, то есть в память.
Если непосредственный операнд —имя, то оно не должно быть перемещаемым, то есть зависеть от адреса загрузки программы в память. Такое имя можно определить оператором EQUили =. Пример:вместо num ассемблер везде подставляет 5num equ 5вместо num ассемблер везде подставляет 3imd = num-2эквивалентно mov al,5, здесь 5 - непосредственный операндmov al.num92Глава 5. Синтаксис ассемблераadd [ s i j .
i m d ; сложение [ s i ] : = [ s i ] + 3 ,; з д е с ь imd - непосредственный операндmov a l , 5 ; a l : = 5 , з д е с ь 5 - непосредственный операндВ данном фрагменте определяются две константы, которые затем используются в качестве непосредственных операндов в командах пересылки MOV и сложения ADD.II Адресные операнды задают физическое расположение операнда в памяти путемуказания двух составляющих адреса: сегмента и смещения (рис. 5.4). К примеру:mov ax,0000hmov ds.axmov ax,ds:0000hзаписать слово в ах из области памятипо физическому адресу 0000:0000Здесь третья команда MOV имеет адресный операнд.Рис. 5.4.
Синтаксис адресных операндовПеремещаемые операнды — любые символьные имена, представляющие некоторые адреса памяти. Эти адреса могут обозначать местоположение в памятинекоторой инструкции (если операнд — метка) или данных (если операнд —имя области памяти в сегменте данных). Перемещаемые операнды отличаютсяот адресных тем, что'они не привязаны к конкретному адресу физической памяти. Сегментная составляющая адреса перемещаемого операнда неизвестнаи определяется после загрузки программы в память для выполнения. К примеру:data segmentmas_w dw 25 dup (0)codesegmentlea s i , _ m a s _ w ; mas_w - перемещаемый операндВ этом фрагменте mas_w — символьное имя, значением которого является адрес первого байта области памяти размером 25 слов. Полный физический адресэтой области памяти будет известен только после загрузки программы в память для выполнения.Счетчик адреса — специфический вид операнда.
Он обозначается знаком $.Специфика этого операнда в том, что когда транслятор ассемблера встречаетСинтаксис ассемблера93в исходной программе этот символ, то он подставляет вместо него текущее значение счетчика адреса. Значение счетчика адреса, или, как его иногда называютсчетчика размещения, представляет собой смещение текущей машинной команды относительно начала сегмента кода. При обработке транслятором очередной команды ассемблера счетчик адреса увеличивается на длину сформированной машинной команды. Важно правильно это понимать. К примеру, обработкадиректив ассемблера не влечет за собой изменения счетчика, так как директивы ассемблера, в отличие от его команд, — это лишь указания транслятору навыполнение определенных действий по формированию машинного представления программы, и для них транслятором не генерируется никаких конструкций в памяти.
В качестве примера использования в команде значения счетчикаадреса можно привести следующий фрагмент:jmp $+3 ; безусловный переход на команду moveld; длина команды eld составляет 1 байтmov al,lПри формировании выражения для перехода, подобного $+3, нужно помнитьо длине самой команды, в которой это выражение используется, так как значение счетчика адреса соответствует смещению в сегменте команд данной, а неследующей за ней команды. В нашем примере команда JMP занимает два байта.Нужно быть осторожным, длина этой и других команд зависит от того, какиев ней используются операнды. Команда с регистровыми операндами будет короче команды, один из операндов которой расположен в памяти. В большинстве случаев эту информацию можно получить, зная формат машинной команды (см.