- •354000 «Прикладная информатика»
- •Idiv Деление целых знаковых чисел
- •Imul Умножение целых знаковых чисел
- •In Ввод из порта
- •Inc Инкремент (увеличение на 1)
- •Int Программное прерывание
- •I into Прерывание по переполнению
- •Iret Возврат из программы обработки прерывания
- •Xchg Обмен данными между операндами
- •Xlat Табличная трансляция
- •Xor Логическое исключающее или
- •Загрузка и выполнение программ
- •Составление программы на языке Assembler и её размещение в памяти компьютера. Стандартное распределение памяти под программные сегменты.
- •Оператор Текст
- •Имя Операнд_1 ;
- •Имя Операнд_1
- •Загрузка и выполнение программ
- •Mov dl,10 ;Позиция X
- •In Считать данные из порта.
- •Исследование команд, выполняемых процессором. Программирование операций с помощью отладчика языка Assembler..
- •Исследование операций с памятью компьютера. Программирование на языка Assembler в операционной системе ms-dos. Обычная память
- •Косвенная адресация
- •Адресация по базе со сдвигом
- •Косвенная адресация с масштабированием
- •Адресация по базе с индексированием
- •Программирование прерываний на языке Assembler в операционной системе ms-dos.
- •Исследование механизмов работа с видеопамятью персонального компьютера типа ibm. Тестирование и отладка ассемблерных программ.
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 не изменяет ни один из операндов.
В качестве операндов можно указывать регистр (кроме сегментного) или ячейку памяти, а в качестве второго операнда еще и непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака.