double arrow

Команды языка ассемблера

Операторы программы на ассемблере

Программа на ассемблере представляет собой последовательность операторов, описывающих выполняемые операции. Оператором (строкой) исходной программы может быть или команда, или псевдооператор языка ассемблер.

Команды языка ассемблера представляют собой краткую нотацию системы команд микропроцессора. Команды в процессе трансляции преобразуются в машинные коды. В отличие от них псевдооператоры представляют собой инструкции для компилятора ассемблера и в машинные коды не преобразуются.

Каждая команда языка ассемблера в исходной программе может иметь до четырех полей следующего вида:

[Метка:] Мнемокод [Операнд] [;Комментарий] .

Поле операнда заполняется только для тех команд, которым требуется операнд. Квадратные скобки показывают, что эти поля не обязательны. Можно набирать содержимое поля в любом месте строки, но обязательно разделять поля хотя бы одним пробелом.

Поле метки служит для присвоения имени команде языка ассемблер. По нему на эту команду могут ссылаться другие команды программы. Метка содержит до 31 символа и должна заканчиваться двоеточием (:). Метку можно начинать с любого символа, кроме цифры. Не используются как метки служебные слова.

Поле мнемокода содержит имя команды микропроцессора. Имена состоят из двух – шести букв. Для трансляции каждого мнемокода программы в его числовой эквивалент ассемблер использует внутреннюю таблицу.

Во многих командах, кроме мнемокода, надо указать один или два операнда. Ассемблер по мнемокоду узнает, сколько должно быть операндов и какого типа, а затем обрабатывает поле операндов.

В командах с двумя операндами первый из них представляет собой приемник, а второй – источник. При исполнении команды операнд-источник никогда не изменяется, в то время как операнд-приемник изменяется почти всегда.

На поле комментариев указывает точка с запятой (;), которая должна быть отдалена от предыдущего поля по крайне мере одним пробелом. Ассемблер игнорирует комментарии при трансляции, но сохраняет их в листинге программы.

Команды, записанные на ассемблере, преобразуется транслятором в машинные команды или объектный код.

Машинные команды занимают от 1 до 6 байтов. Код операции (КОП) занимает один или два первых байта команды. В ПК столь много различных операций, что для них не хватает 256 различных КОПов, которые можно представить в одном байте. Поэтому некоторые операции объединяются в группу, и им дается один и тот же КОП, во втором же байте этот КОП уточняется. Кроме того, во втором байте указываются типы и способ адресации операндов. Остальные байты команды указывают на операнды. У большинства команд - один или два операнда. Размер операндов - байт или слово (редко -двойное слово). Операнд может быть указан в самой команде (это т.н. непосредственный операнд), либо может находиться в одном из регистров и тогда в команде указывается этот регистр, либо может находиться в ячейке памяти и тогда в команде тем или иным способом указывается адрес этой ячейки. Некоторые команды требуют, чтобы операнд находился в фиксированном месте (например, в регистре AX), тогда операнд явно не указывается в команде. Результат выполнения команды помещается в регистр или ячейку памяти, из которого (которой), как правило, берется первый операнд. Например, большинство команд с двумя операндами реализуют действие op1 := op1 ‑ op2, где op1 - регистр или ячейка, а op2 - непосредственный операнд, регистр или ячейка.

Адрес операнда разрешено модифицировать по одному или двум регистрам. В первом случае в качестве регистра-модификатора разрешено использовать регистр BX, BP, SI или DI (и никакой иной). Во втором случае один из модификаторов обязан быть регистром BX или BP, а другой - регистром SI или DI; одновременная модификация по BX и BP или SI и DI недопустима.

В ассемблере адреса в командах записываются в виде одной из следующих конструкции:

A, A[M] или A[M1][M2],

где A - адрес, M - регистр BX, BP, SI или DI, M1 - регистр BX или BP, а M2 - регистр SI или DI. Во втором и третьем варианте A может отсутствовать, в этом случае считается, что A=0.

При выполнении команды процессор прежде всего вычисляет т.н. эффективный (исполнительный) адрес - как сумму адреса, заданного в команде, и текущих значений указанных регистров-модификаторов, причем все эти величины рассматриваются как неотрицательные и суммирование ведется по модулю 216 ([r] означает содержимое регистра r):

A : Aисп = A

A[M] : Aисп = A+[M] (mod 216)

A[M1][M2]: Aисп = A+[M1]+[M2] (mod 216)

Полученный таким образом 16-разрядный адрес определяет т.н. смещение - адрес, отсчитанный от начала некоторого сегмента (области) памяти. Перед обращением к памяти процессор еще добавляет к смещению начальный адрес этого сегмента, (он хранится в некотором сегментном регистре), в результате чего получается окончательный 20-разрядный адрес, по которому и происходит реальное обращение к памяти.


Сейчас читают про: