Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2012 ЛР Ассемблер Архитектура ВС 6 семестр.doc
Скачиваний:
7
Добавлен:
03.05.2019
Размер:
454.66 Кб
Скачать

Iret Возврат из программы обработки прерывания

Команда IRET возвращает управление прерванному в результате аппаратно­го или программного прерывания процессу. Команда извлекает из стека три верхние слова и помещает их в регистры IP, CS и флагов (см. команду INT). Ко­мандой IRET должна завершаться любая программа обработки прерывания.

Jcc Команды условных переходов

Команды условных переходов осуществляют переход по указанному адресу при выполнении условия, заданного мнемоникой команды. Если заданное усло­вие не выполняется, переход не осуществляется, а выполняется команда, сле­дующая за конкретной командой условного перехода. Переход может осуществ­ляться как вперед, так и назад в диапазоне +127...-128 байтов.

JMP Безусловный переход

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

- переход прямой короткий (в пределах -128...+127 байтов);

- переход прямой ближний (в пределах текущего сегмента команд);

- переход прямой дальний (в другой сегмент команд);

- переход косвенный ближний;

- переход косвенный дальний.

Все разновидности переходов имеют одну и ту же мнемонику JMP, хотя и различающиеся коды операций. В некоторых случаях транслятор может опреде­лить вид перехода по контексту, в тех же случаях, когда это невозможно, следует использовать атрибутные операторы:

short - прямой короткий переход;

near ptr - прямой ближний переход;

far ptr - прямой дальний переход;

word ptr - косвенный ближний переход;

dword ptr - косвенный дальний переход.

LAHF Загрузка флагов в регистр АН

Команда LAHF копирует флаги SF, ZF, AF, PF и CF соответственно в разряды 7, 6, 4, 2 и 0 регистра АН. Значение битов 5, 3 и 1 не определено.

Команда LAHF (совместно с командой SAHF) дает возможность читать и вменять значение флагов процессора, в том числе флагов SP, ZF, AF и PF, которые нельзя изменить непосредственно.

JDS Загрузка указателя с использованием регистра DS

Команда LDS считывает из памяти по указанному адресу двойное слово, содержащее указатель (полный адрес некоторой ячейки), и загружает младшую половину указателя (т.е. относительный адрес) в указанный в команде регистр, а старшую половину указателя (т.е. сегментный адрес) в регистр DS. Таким образом, команда

lds reg,mem

эквивалентна по результату следующей группе команд:

mov reg,word ptr mem

mov DS,word ptr mem+2

В качестве первого операнда команды LDS должен быть указан регистр об­щего назначения, в качестве второго - ячейка памяти.

LEA Загрузка исполнительного адреса

Команда LEA загружает в регистр, указанный в команде в качестве первого операнда, относительный адрес второго операнда. В качестве первого операнда следует указывать регистр общего назначения, в качестве второго - ячейку памя­ти. Команда

lea reg,mem

по своему результату эквивалентна команде

mov reg,offset mem

LES Загрузка указателя с использованием регистра ES

Команда LES считывает из памяти по указанному адресу двойное слово, со­держащее указатель (полный адрес некоторой ячейки), и загружает младшую по­ловину указателя (смещение) в указанный в команде регистр, а старшую полови­ну указателя (сегментный адрес) в регистр ES. Таким образом, команда

les reg,mem эквивалентна по результату следующей паре команд:

mov reg,word ptr mem

mov ES,word ptr mem+2

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

LOOP Циклическое выполнение, пока содержимое СХ не равно нулю

Команда LOOP выполняет декремент содержимого регистра СХ и если оно не равно 0 осуществляет переход на указанную метку вперед или назад в том же сегменте команд в диапазоне -128...+127 байтов. Содержимое регистра СХ рас­сматривается как целое число без знака, поэтому максимальное число повторений группы включенных в цикл команд составляет 65536 (если перед входом в цикл СХ=0).

LOOPE Цикл, пока равно

Команда выполняет декремент содержимого регистра СХ и если оно не рав­но 0 и флаг ZF установлен осуществляет переход на указанную метку вперед или назад в том же программном сегменте в диапазоне -128...+127 байтов. Содержи­мое регистра СХ рассматривается как целое число без знака, поэтому максималь­ное число повторений группы включенных в цикл команд составляет 65536.

LOOPNE Цикл, пока не равно

Команда выполняет декремент содержимого регистра СХ и если оно не рав­но 0 и флаг ZF сброшен осуществляет переход на указанную метку вперед или назад в том же программном сегменте в диапазоне -128...+127 байтов. Содержи­мое регистра СХ рассматривается как целое число без знака, поэтому максималь­ное число повторений группы включенных в цикл команд составляет 65536.

LOOPNZ Цикл, пока не нуль

Команда выполняет те же действия, что и LOOPNE.

LOOPZ Цикл, пока нуль

Команда выполняет те же действия, что и LOOPE.

MOV Пересылка данных

Команда MOV замещает первый операнд (приемник) вторым (источником). При этом исходное значение первого операнда теряется. В зависимости от опи­сания операндов пересылается слово или байт. Если операнды описаны по-разному или режим адресации не позволяет однозначно определить размер опе­ранда, для уточнения размера передаваемых данных в команду следует включить один из атрибутных операторов byte ptr или word ptr. В зависимости от использо­ванных режимов адресации команда MOV осуществляет пересылки следующих видов:

- из регистра общего назначения в регистр общего назначения;

- из ячейки памяти в регистр общего назначения;

- из регистра общего назначения в ячейку памяти;

- непосредственный операнд в регистр общего назначения;

- непосредственный операнд в ячейку памяти;

- из регистра общего назначения в сегментные регистры;

- из сегментного регистра в регистр общего назначения;

- из сегментного регистра в ячейку памяти.

Запрещены пересылки из ячейки памяти в ячейку памяти (для этого преду­смотрена команда MOVS), а также загрузка сегментного регистра непосредст­венным значением. Нельзя также непосредственно переслать содержимое одного сегментного регистра в другой.

MOVS Пересылка данных из строки в строку MOVSB Пересылка байта данных из строки в строку

MOVSW Пересылка слова данных из строки в строку

Команды предназначены для операций над строками (строкой называется последовательность байтов или слов памяти с любым содержимым). Они пересы­лают по одному элементу строки, который может быть байтом или словом. Пер­вый операнд (приемник) адресуется через ES:DI, второй (источник) - через DS:SI. Операцию пересылки можно условно изобразить следующим образом:

( DS:SI) (ES:DI)

После каждой операции пересылки регистры SI и DI получают положитель­ное (если флаг DF=0) или отрицательное (если флаг DF=1) приращение. Величи­на приращения составляет 1 или 2 в зависимости от размера пересылаемых эле­ментов.

Вариант команды MOVS имеет формат:

movs строка_1, строка_2

(что не избавляет от необходимости инициализировать регистры ES:DI и DS:SI адресами строк строка 1 и строка_2; операнды лишь позволяют ассемблеру оп­ределить по описанию полей данных строка_1 и строка_2 размерность пересылаемых данных - байт или слово). В этом формате возможна замена сегмента второй строки:

movs строка_1, ЕS:строка_2

Рассматриваемые команды могут предваряться префиксом повторения REP (повторять СХ раз). После выполнения рассматриваемых команд регистры SI и DI указывают на ячейки памяти, находящиеся за теми (если DF=0) или перед те­ми (если DF=1) элементами строк, на которых закончились операции пересылки.

MUL Умножение целых беззнаковых чисел

Команда MUL выполняет умножение целого беззнакового числа, находяще­гося в регистре AL (в случае умножения на байт) или АХ (в случае умножения на слово), на операнд-источник (целое число без знака). Размер произведения в два раза больше размера сомножителей.

Для однобайтовых операций один из сомножителей помещается в регистр AL; после выполнения операции произведение записывается в регистр АХ.

Для двухбайтовых операций один из сомножителей помещается в регистр АХ; после выполнения операции произведение записывается в регистры DX:AX (в DX - старшая часть, в АХ - младшая).

В качестве операнда-сомножителя можно указывать регистр данных или ячейку памяти; не допускается умножение на непосредственное значение.

NEG Изменение знака, дополнение до 2

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

NOP Холостая команда

По команде NOP процессор не выполняет никаких действий кроме увеличе­ния на 1 (поскольку команда NOP занимает 1 байт) содержимого указателя ко­манд IP. Команда иногда используется в отладочных целях чтобы "забить" какие-то ненужные команды, не изменяя длину загрузочного модуля или, наоборот, ос­тавить место в загрузочном модуле для последующей вставки команд. В ряде случаев команды NOP включаются в текст объектного модуля транслятором.

NOT Инверсия, дополнение до 1

Команда NOT выполняет инверсию битов указанного операнда, заменяя 0 на 1 и наоборот. В качестве операнда можно указывать регистр (кроме сегментного) или ячейку памяти размером байт или слово. Нельзя использовать в качестве операнда непосредственное значение.

OR Логическое ВКЛЮЧАЮЩЕЕ ИЛИ

Команда OR выполняет операцию логического (побитового) сложения двух операндов. Результат замещает первый операнд (приемник); второй операнд (ис­точник) не изменяется. В качестве операндов можно указывать регистр (кроме сегментного) или ячейку памяти, а в качестве второго еще и непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами.

OUT Вывод в порт

Команда OUT выводит в порт, указываемый первым операндом, байт или слово соответственно из регистра AL или АХ. Адрес порта помещается в регистр DX. Если адрес порта не превышает 255, он может быть указан непосредствен­ным значением. Указание регистра-источника (AL или АН) обязательно.

POP Извлечение слова из стека

Команда POP пересылает слово из вершины стека (на которую указывает ре­гистр SP) по адресу операнда-приемника. Затем содержимое SP увеличивается на

2 и указывает на новую вершину стека.

В качестве операнда-приемника можно использовать любой 16-разрядный регистр (кроме CS) или ячейку памяти.

POPF Восстановление из стека регистра флагов

Команда POPF пересылает определенные биты слова из вершины стека (на которую указывает регистр SP) в регистр флагов. Затем содержимое SP увеличи­вается на 2 и указывает на новую вершину стека. Команда воздействует на все флаги процессора.

PUSH Занесение операнда в стек

Команда PUSH уменьшает на 2 содержимое указателя стека SP и заносит на эту новую вершину содержимое двухбайтового операнда-источника.

В качестве операнда-источника может использоваться любой 16-разрядный регистр (включая сегментные) или ячейка памяти.

PUSHF Занесение в стек содержимого регистра флагов

Команда PUSH уменьшает на 2 содержимое указателя стека SP и заносит на эту новую вершину содержимое регистра флагов.

RCL Циклический сдвиг влево через бит переноса

Команда RCL осуществляет сдвиг влево всех бит операнда. Если команда за­писана в формате

RCL операнд,1

выполняется сдвиг на 1 бит. В младший бит операнда заносится значение флага CF; старший бит операнда загружается в CF. Если команда записана в формате

RCL операнд,CL

сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда поступают сначала в CF, а оттуда - в младшие биты операнда.

В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. В качестве операнда нель­зя использовать непосредственное значение.

RCR Циклический сдвиг вправо через бит переноса

Команда RCR осуществляет сдвиг вправо всех бит операнда. Если команда записана в формате

RCR операнд,1

сдвиг осуществляется на 1 бит. В старший бит операнда заносится значение фла­га CF; младший бит операнда загружается в CF. Если команда записана в форма­те

RCL операнд,CL

сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов младшие биты операнда поступают снача­ла в CF, а оттуда - в старшие биты операнда.

В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. В качестве операнда нель­зя использовать непосредственное значение.

RET Возврат из процедуры

RETN Возврат из ближней процедуры

RETF Возврат из дальней процедуры

Команда RET извлекает из стека адрес возврата и передает управление в про­грамму, вызвавшую процедуру. Если командой RET завершается ближняя процедура, объявленная с атрибутом NEAR, или используется форма команды RETN, со стека снимается одно слово - смещение точки возврата. Передача управления в этом случае осуществляется в пределах одного сегмента. Если командой RET завершается дальняя процедура, объявленная с атрибутом FAR, или используется форма команды RETF, со стека снимаются два слова: смещение и сегмент точки возврата. В этом случае передача управления будет межсегментной.

В команду RET может быть включен необязательный операнд (кратный 2), который указывает, на сколько байтов дополнительно смещается (в сторону больших адресов) указатель стека после возврата в вызывающую программу. Прибавляя эту константу к новому значению SP, команда RET обходит аргумен­ты, помещенные в стек вызывающей программой перед вызовом команды CALL.

ROL Циклический сдвиг влево

Команда ROL осуществляет сдвиг влево всех бит операнда. Если команда за­писана в формате

ROL операнд,1

сдвиг осуществляется на 1 бит. Старший бит операнда загружается в его млад­ший разряд. Если команда записана в формате

ROL операнд,CL

сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда перемещаются в его младшие разряды.

В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использо­вать в качестве операнда непосредственное значение.

ROR Циклический сдвиг вправо

Команда ROR осуществляет циклический сдвиг вправо всех бит операнда. Если команда записана в формате

ROR операнд, 1

сдвиг осуществляется на 1 бит. Младший бит операнда записывается в его стар­ший разряд. Если команда записана в формате

ROR операнд,CL

сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов младшие биты операнда перемещаются в его старшие разряды.

В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Нельзя использовать в ка­честве операнда непосредственное значение.

SAHF Запись содержимого регистра АН в регистр флагов

Команда SAHF копирует биты 7, 6, 4, 2 и 0 регистра АН в младший байт ре­гистра флагов, влияя на флаги SF, ZF, AF, PF и CF.

Команда SAHF (совместно с командой LAHF) дает возможность читать и изменять значение флагов процессора, в том числе флагов SF, ZF, AF и PF, кото­рые нельзя изменить непосредственно.

SAL Арифметический сдвиг влево

Команда SAL осуществляет сдвиг влево всех битов операнда. Старший бит операнда поступает в флаг CF. Если команда имеет форму

SAL операнд,1

сдвиг осуществляется на 1 бит. В младший бит операнда загружается 0. Если ко­манда записана в формате

SAL операнд,CL

сдвиг осуществляется на число битов, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда, пройдя через флаг CF, теряются, а младшие заполняются нулями.

В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Нельзя использовать в ка­честве операнда непосредственное значение.

Каждый сдвиг влево эквивалентен умножению знакового числа на 2, поэтому команду SAL удобно использовать для возведения операнда в степень 2.

SAR Арифметический сдвиг вправо

Команда SAR осуществляет сдвиг вправо всех битов операнда. Младший бит операнда поступает в флаг CF. Если команда записана в формате

SAR операнд,1

сдвиг осуществляется на 1 бит. Старший бит операнда сохраняет свое значение. Если команда записана в формате

SAR операнд,CL

сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов младшие биты операнда, пройдя через флаг CF, теряются, а старший бит расширяется вправо.

В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Нельзя использовать в ка­честве операнда непосредственное значение.

Каждый сдвиг вправо эквивалентен делению знакового числа на 2, поэтому команду SAR удобно использовать для деления операнда на целые степени 2.

SBB Целочисленное вычитание с займом

Команда SBB вычитает второй операнд (источник) из первого (приемника). Результат замещает первый операнд, предыдущее значение которого теряется. Если установлен флаг CF, из результата вычитается еще 1. Таким образом, если команду вычитания записать в общем виде

sbb операнд_1, операнд_2

то ее действие можно условно изобразить следующим образом:

о перанд_1 - операнд_2 - CF операнд_ 1

В качестве операндов можно указывать регистр (кроме сегментного) или ячейку памяти, а в качестве второго операнда еще и непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памя­ти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака.

SCAS Сканирование строки с целью сравнения

SCASB Сканирование строки байтов с целью сравнения

SCASW Сканирование строки слов с целью сравнения

Команды предназначены для операций над строками (строкой называется последовательность байтов или слов памяти с любым содержимым). Они сравни­вают содержимое регистра AL (в случае операций над байтами) или АХ (в случае операций над словами) с содержимым ячейки памяти по адресу, находящемуся в паре регистров ES:DI. Операция сравнения осуществляется путем вычитания со­держимого ячейки памяти из содержимого AL или АХ. Результат операции воз­действует на регистр флагов, но не изменяет ни один из операндов. Таким обра­зом, операцию сравнения можно условно изобразить следующим образом:

АХ или AL - (ES:DI) -» флаги процессора

После каждой операции сравнения регистр DI получает положительное (если флаг DF=0) или отрицательное (если флаг DF=1) приращение. Величина прира­щения составляет 1 или 2 в зависимости от размера сравниваемых элементов.

Вариант команды SCAS имеет формат

seas строка

(что не избавляет от необходимости инициализировать регистры ES:DI адресом строки строка; операнд лишь позволяет ассемблеру определить по описанию по­ля данных строка размерность сравниваемых данных - байт или слово). Замена сегментного регистра (ES), через который адресуется строка, невозможна.

Рассматриваемые команды могут предваряться префиксами повторения REPE/REPZ (повторять до первого неравенства) и REPNE/REPNZ (повторять до первого равенства). В любом случае выполняется не более СХ операций над по­следовательными элементами.

После выполнения рассматриваемых команд регистр DI указывает на ячейку памяти, находящуюся за тем (если DF=0) или перед тем (если DF=1) элементом строки, на котором закончились операции сравнения.

SHL Логический сдвиг влево

Команда SHL выполняет те же действия, что и SAL.

SHR Логический сдвиг вправо

Команда SHR осуществляет сдвиг вправо всех бит операнда. Младший бит операнда поступает в флаг CF. Если команда имеет форму

SHR операнд,1

сдвиг осуществляется на 1 бит. В старший бит операнда загружается 0, а млад­ший теряется. Если команда имеет форму

SHR операнд,CL

сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда заполняются ну­лями, а младшие, пройдя через флаг CF, теряются.

В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Нельзя использовать в ка­честве операнда непосредственное значение.

STC Установка флага переноса

Команда STC устанавливает флаг переноса CF в регистре флагов.

STD Установка флага направления

Команда STD устанавливает флаг направления DF в регистре флагов, опре­деляя тем самым обратное направление выполнения строковых операций (в по­рядке убывания адресов элементов строки).

STI Установка флага прерывания

Команда STI устанавливает флаг IF в регистре флагов, разрешая все аппа­ратные прерывания.

STOSW Запись слова в строку данных

Команды предназначены для операций над строками (строкой называется последовательность байтов или слов с любым содержимым). Они копируют со­держимое регистра AL (при операциях над байтами) или АХ (при операциях над словами) в ячейку памяти соответствующего размера по адресу, определяемому содержимым ES:DI. После операции копирования DI получает положительное (если флаг DF=0) или отрицательное (если флаг DF=1) приращение. Величина приращения составляет 1 или 2 в зависимости от размера копируемого элемента.

Вариант команды STOS имеет формат

stos строка

(что не избавляет от необходимости инициализировать регистры ES:DI адресом строки строка; операнд лишь позволяет ассемблеру определить по описанию по­ля данных строка размерность записываемых данных - байт или слово). Заме­нить сегментный регистр ES нельзя.

Рассматриваемые команды могут предваряться префиксом повторения REP. В этом случае они повторяются СХ раз, заполняя последовательные ячейки па­мяти одним и тем же содержимым регистра AL или АХ.

SUB Вычитание целых чисел

Команда SUB вычитает второй операнд (источник) из первого (приемника) и помещает результат на место первого операнда. Исходное значение первого операнда (уменьшаемое) теряется. Таким образом, если команду вычитания записать в общем виде

sub операнд_1, операнд_2

то ее действие можно условно изобразить следующим образом:

о леранд_1 - операнд_2 операнд_1

В качестве операндов можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго операнда еще и непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памя­ти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака.

TEST Логическое сравнение

Команда TEST выполняет операцию логического И над двумя операндами и в зависимости от результата устанавливает флаги SF, ZF и PF. Флаги OF и CF сбрасываются, a AF имеет неопределенное значение. Состояние флагов можно затем проанализировать командами условных переходов. Команда TEST не изме­няет ни один из операндов.

В качестве операндов можно указывать регистр (кроме сегментного) или ячейку памяти, а в качестве второго операнда еще и непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памя­ти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]