Индексную базовую базово-индексную
Индексная
При задании адреса используется один из индексных регистров esi ( si ) или edi ( di ).При таком способе адресации адрес области памяти может иметь вид:
-индексный регистр в квадратных скобках. Например, команда вида mov [esi], ’\0’
-некоторое символическое имя и индексный регистр в квадратных скобках.mov arr[esi], 10
-в квадратных скобках индексный регистр, символическое имя и константы, соединенные знаком +. mov [arr + esi], 1 mov [arr + esi+4], 2
С помощью этого метода разрешается организовывать доступ к одномерным массивам байтов. Смещение соответствует адресу начала массива. Число в регистре - индексу элемента массива, который надо считать. Eсли массив состоит из байтов, базовый регистр увеличиваем на 1, если из слов, увеличиваем на 2, если из двойных слов - на 4. Масштабирование, которое выполняется в Си при увеличении адреса можно заменить умножением базового регистр на 2, для двойных слов - на 4.
Базовая
Если применяется базовая адресация, то при задании адреса используется один из базовых регистров: либо ЕBX(ВХ) либо BP
При таком способе адресации адрес области памяти, куда помещается информация, может быть записан:
-заключением в квадратные скобки базового регистра: MOV [ebx],10
-заключением в квадратные скобки не базового регистра, символического имени: MOV [x+ebx],10
- заключением в квадратные скобки базового регистра, символического имени и некоторого числа-смещения: MOV [x+ebx+4],10
С помощью этого метода разрешается организовывать доступ к одномерным массивам байтов. Смещение соответствует адресу начала массива. Число в регистре - индексу элемента массива, который надо считать.
Базово-индексная
это когда при задании адреса используются один из базовых регистров : ebx (bx) ebp (bp)и один из индексных регистров: esi (si)либоedi (di)
-либозаключением в квадратные скобки базового и индексного регистров, например, можно записать так : MOV[BX,SI],25
- либо заключением в квадратные скобки не только базового и индексного регистров, но и некоторого символического имени, например MOV А[ЕBX,ЕSI],2007
- либо заключением в квадратные скобки не только базового регистра и индексного регистра, некоторого символического имени, но и некоторого числа, называемого смещением. Например,
MOV [X+ЕBX+ЕSI+4],2007
mov ax,[bx+si+2]
mov ax,[bx][si]+2
mov ax,[bx+2][si] Разные способы записи одного и того же
mov ax,[bx][si+2]
mov ax,2[bx][si]
адресация по базе с индексированием и масштабированием
Это самая полная схема адресации, в которую входят все случаи, рассмотренные ранее как частные. Смещение может быть байтом или двойным словом. Если ESP или ЕВР используются в роли базового регистра, селектор сегмента операнда берется по умолчанию из регистра SS, во всех остальных случаях - из DS.
mov [ebx-4][esi*4],edx
Арифметические команды
Двоичной aрифметики | Десятичной арифметики | |
Add | Imul | Aaa |
Adc | Mul | Daa |
Inc | Idiv | Aas |
Sub | Div | Das |
Sbb | Neg | Aam |
Dec | Aad |
Команды сложения
add приёмник, источник– выполняет сложение приёмника и источника, результат заносится в приёмник. Источник не изменяется, меняются флаги. Команда ADD не различает числа со знаком и без знака, но, употребляя значения флагов CF (перенос при сложении чисел без знака), OF (перенос при сложении чисел со знаком) и SF (знак результата), разрешается применять ее и для тех, и для других.
adc приёмник, источник– выполняет сложение приёмника, источника и флага CF. Обычно эта команда используется для сложения чисел повышенной точности.
inc приемник (инкремент) - увеличивает приемник (регистр или переменная) на 1. Единственное отличие этой команды от add приемник,1
состоит в том, что флаг CF не затрагивается, а остальные меняются в соответствии с правилами сложения.
Команды вычитания
sub приёмник, источник – вычитает источник из приёмника, результат заносит в приёмник.
sbb приёмник, источник – вычитает из приёмника значение источника, затем вычитает значение CF . Её можно использовать для вычитания 64-битных слов.
dec приемник (декремент) - увеличивает приемник (регистр или переменная) на 1. Единственное отличие этой команды от sub приемник,1
состоит в том, что флаг CF не затрагивается, а остальные меняются в соответствии с правилами сложения.
Команды умножения
MUL источник - умножение чисел без знака
Источник умножается на al|ax|eaxв зависимости от разрядности операнда.
Результат располагается в ax|dx:ax|edx:eaxсоответственно.
Если результат поместился в младшую половину, то CF=OF=0, иначе CF=OF=1. ZF, SF, AF, PF – не определены.
Умножение со знаком:
1.IMUL источник (регистр или переменная) умножается на AL, АХ или ЕАХ (в зависимости от размера операнда), и результат располагается в АХ, DX и AX или EDX и EAX соответственно.
2.IMUL приемник, источник: источник (число, регистр или переменная) умножается на приемник (регистр), и результат заносится в приемник.
3.IMUL приемник, источник1, источник2:источник 1 (регистр или переменная) умножается на источник 2 (число), и результат заносится в приемник (регистр).
1. Команды деления
DIV источник – целочисленное деление без знака.
IDIV источник – целочисленное деление co знаком.
Команда DIV выполняет деление целого числа без знака , из регистра АХ (в случае деления на байт), DX и AX (в случае деления на слово) и EDX и EAX (в случае деления на двойное слово), на операнд-источник (целое число без знака). Частное заносится в AL(в случае деления на байт), AX(в случае деления на слово),EAX(в случае деления на двойное слово); остаток в AH(в случае деления на байт), DX(в случае деления на слово), EDX(в случае деления на двойное слово). Размер делимого в два раза больше размеров делителя и остатка. Флаги ZF, SF, CF, OF, AF, PF после этой команды не определены.
Остальные команды
Команда изменения знака NEG.
NEG приемник (регистр или переменная)
Выполняет над числом, содержащимся в приемнике (регистр или переменная), операцию дополнения до двух. Эта операция эквивалентна обращению знака операнда, если рассматривать его как число со знаком. Если приемник равен нулю, флаг CF = 0, иначе 1. Остальные флаги (OF, SF, ZF, AF, PF) назначаются в соответствии с результатом операции.
КомандаXCHG выполняет обмен двух значений. Обмен значений можно выполнять двух между регистрами или между регистрами и памятью:
XCHG приемник, источник
Команда NOP - ничего не делающая команда
NOP
Эта команда не делает абсолютно ничего (пустая команда). Она только занимает пространство и время. Используется для резервирования места в сегменте кода или организации программной задержки.
22. Команды преобразования:
CBW Преобразование байта в слово (convert byte to word)
Команда CBW заполняет регистр AH знаковым битом содержимого регистра АL, преобразуя тем самым 8-разрядное число со знаком в 16-разрядное. Команду удобно использовать для преобразования байтового делимого в двухбайтовое (слово) при делении на 8-разрядный операнд.
CWD Преобразование слова в двойное слово
(convert word to double word)
Команда CWD заполняет регистр DX знаковым битом содержимого регистра АХ, преобразуя тем самым 16-разрядное число со знаком в 32-разрядное. Команду удобно использовать для преобразования двухбайтового делимого в четырехбайтовое (двойное слово) при делении на 16-разрядный операнд.
CWDE Преобразование слова в двойное слово
Команда CWDE заполняет старшие два байта регистра EAX знаковым битом содержимого регистра АХ, преобразуя тем самым 16-разрядное число со знаком в 32-разрядное.
CDQ Преобразование двойного слова в четвертное слово
(convert double to quadric)
Команда CDQ заполняет регистр EDX знаковым битом содержимого регистра EАХ, преобразуя тем самым 32-разрядное число со знаком в 64-разрядное. Команду удобно использовать для преобразования четырехбайтового делимого в восьмибайтовое (четвертное слово) при делении на 32-разрядный операнд.
23Команды сравнения:
Логическое сравнение
TEST приемник, источник
Команда используется для логического умножения двух операндов (вычисляет результат действия побитового «логического И») над приемником и источником, не сохраняя результата.
TEST ECX,EDX
Устанавливает флаги SE ZF и PF в соответствии с полученным показателем, флаги OF и CF обнуляются, значение AF не определено.
TEST, так же как и CMP используется в основном в сочетании с командами условного перехода и условной пересылки данных.
Команда TEST устанавливает только флаги, а операнд не изменяется.
Команды сравнения
CMP приемник, источник
Сравнивает приемник и источник и устанавливает флаги. Сравнение - путем вычитания источника из приемника, причем результат вычитания никуда не записывается.
Единственным следствием работы этой команды оказывается изменение флагов CF, OF, SF, ZF, AF и PF. Обычно команду СМР используют вместе с командами условного перехода и условной пересылки данных .
если ( АХ ) < ( BX ) , то значение бита SF=1.
если ( АХ ) > ( BX ) , то значение бита SF=0
если ( АХ ) = ( BX ) , то значение бита ZF=1.
24 Команды управления:
Команда безусловного перехода
JMP операнд
Команда передает управление в другую точку программы, не сохраняя информации для возврата. Операндом может быть непосредственный адрес для перехода (обычно метка), а также регистр или переменная, содержащая адрес. Команда не изменяет содержимое флагов.
Общий вид команды
JMP ADDRESS
Команды условных переходов
Команды условного перехода имеют следующий общий вид :
КОП Адрес
КОП определяет условие перехода.
Адресопределяет, куда нужно перейти, если условие, закодированное в коде операции, соответствует текущему значению регистра флажков.
Различают команды условного перехода для знаковых и беззнаковых чисел.
Слова «выше -A» и «ниже - B» в таблице относятся к сравнению чисел без знака; слова «больше - G» и «меньше - L» учитывают знак.
!!Команды условных переходов не поддерживают дальних переходов (>128)
Для чисел без знака
JB/JNAE
Переход если ниже; переход если не выше или равноCF = 1
JAE/JNB
Переход если выше или равно; переход если не ниже CF = 0
JBE/JNA
Переход если ниже или равно; переход если не выше CF=1 или ZF = 1
JA/JNBE
Переход если выше; переход если не ниже или равно CF=0 и ZF=0
Для чисел со знаком
JL/JNGE
Переход если меньше; переход если не больше или равноS<>0
JGE/JNL
Переход если больше или равно; переход если не меньшеC = 0
JLE/JNG
Переход если меньше или равно; переход если не большеZ=1 или
Z<>0
JG/JNLE
Переход если больше; переход если не меньше илиравноZ=0 или S=0
Для прочих данных
JE/JZ Переход если равно ZF = 1
JNE/JNZ Переход если не равноZF = 0
JPПереход при успешной проверке четности JPE;
переход при четностиPF = 1
JNP Переход при неуспешной проверке четности
JPOПереход при нечетности PF = 0
JS Переход если есть знакSF = 1
JNSПереход если нет знака SF = 0
JC Переход если есть перенос СF = 1
JNC Переход если нет переноса CF = 0
JO Переход если есть переполнение OF = 1
JNO Переход если нет переполнения
Команда перехода с учетом состояния регистра CX (ЕСХ)
JCXZ метка
Выполняет ближний переход на указанную метку, еслиСХ=0
JECXZ метка
Выполняет ближний переход на указанную метку, еслиЕСХ=0
25 Команды организации циклов:
для предотвращения выполнения цикла при нулевом ecx или cx нужна команда jecxz/jcxz. Если этого не сделать, то при изначально нулевом ecx/cx цикл повторится 4 294 967 295 или 65 536 раз;
Команда организации цикла со счетчиком.
LOOP метка
1. От содержимого регистра CX (ЕСХ) отнимается 1 и результат снова помещается в регистр CX(ЕСХ)
2. Если содержимое регистра CX(ЕСХ) оказывается равным 0, то больше ничего не делается, а точнее, выполняется следующая за командой LOOP команда.
3.Если же содержимое регистра CX(ЕСХ) не равно 0, то передается управление на команду, которая помечена меткой, указанной в команде LOOP
Эта команда используется для организации циклов, в которых регистр ECX (CX) играет роль счетчика.
Команда организации цикла с учетом флага ZF.
Имеются разновидности команды LOOP:
LOOPE метка цикл, пока равно
LOOPZметка цикл, пока ноль
LOOPNE метка цикл, пока не равно
LOOPNZ метка цикл, пока не ноль
Проанализировать регистр ZF:
1.От содержимого регистра CX (ЕСХ) отнимается 1 и результат снова помещается в регистр CX
2.Если содержимое регистра CX(ЕСХ) =0, выполняется следующая за командой LOOP команда.
3.Если содержимое регистра CX(ЕСХ) не равно 0, то передается управление на команду, которая помечена меткой, указанной в команде LOOP .
4. Если регистр ZF=0, то для команд LOOPE и LOOPZ это означает выход из цикла, а для команд LOOPNE и LOOPNZ – переход к началу цикла.
5. Если регистр ZF=1, то для команд LOOPE и LOOPZ это означает переход к началу цикла, а для команд LOOPNE и LOOPNZ – выход из цикла.
При этом надо учитывать, что сами команды флаг ZF не меняют, поэтому флаг должен быть установлен предыдущей командой
26 Команды пересылки:
Команда пересылки данных.
MOV приемник, источник
Команда MOV действует аналогично операторам присваивания из языков высокого уровня, то естьmov ах, bх ~ ах = bх
Условная пересылка данных.
Условная пересылка данных
(команды появились в процессорах PentiumPro и Pentium II).
CMOVcc приемник,источник
Это набор команд, которые копируют содержимое источника в приемник, в зависимости от значения тех или иных флагов из регистра FLAGS
Источник - регистр общего назначения или переменная, а приемником - только регистр.
Команда пересылки с расширением знака
MOVSX приемник, источник
Копирует содержимое источника (регистр или переменная размером в байт или слово) в приемник (16- или 32-битный регистр) и расширяет знак аналогично командам CBW/CWDE
Команда пересылки с расширением нулями
MOVZX приемник, источник
Пересылка с расширением нулями. Копирует содержимое источника (регистр или переменная размером в байт или слово) в приемник (16- или 32-битный регистр) и расширяет нулями.
27 Логические команды:
логическое И - and, логическое ИЛИ - or,
Исключающее ИЛИ - xor;
NOT инвертирует бит источника.
логические, арифметические и циклические сдвиги;
проверка битов и операндов;
установка и очистка битов (флагов) регистра состояния процессора
( PSW).
Циклические
Циклические сдвиги позволяют сдвигать биты кода операнда по кругу (по часовой стрелке при сдвиге вправо или против часовой стрелки при сдвиге влево). При этом в кольцо сдвига может входить или не входить флаг переноса.
В бит флага переноса (если он используется) записывается значение старшего бита при циклическом сдвиге влево и младшего бита при циклическом сдвиге вправо. Соответственно, значение бита флага переноса будет переписываться в младший разряд при циклическом сдвиге влево и в старший разряд при циклическом сдвиге вправо.
Арифметические
Для сдвига влево
если of=1, то текущее значение флагаcf и выдвигаемого слева бита операнда различны;
если of=0, то текущее значение флага cf и выдвигаемого слева бита операнда совпадают
Логические
Для сдвигов вправо
Флаг of всегда сбрасывается в ноль в операциях сдвига на один разряд
Циклические
Особенность этого сдвига в том, что он происходит с некоторой задержкой, так как очередной сдвигаемый бит оказывается на некоторое время вне операнда.
Отличие этого сдвига от rcl(rcr) в том, что очередной сдвигаемый бит одновременно вдвигается в операнд справа(слева) и становится значением флага cf.
Проверка битов и флагов
Команды установки и очистки битов регистра состояния процессора (то есть флагов) позволяют установить или очистить любой флаг, что бывает очень удобно. Каждому флагу обычно соответствуют две команды, одна из которых устанавливает его в единицу, а другая сбрасывает в нуль.
Флагу переноса C (от Carry) будут соответствовать команды CLC(очистка) и SEC или STC (установка).
SAHF Запись содержимого регистра АН в регистр флагов
LAHFЗагрузка в АН содержимого регистра флагов
Команда sahfкопирует разряды 7, 6, 4, 2 и 0 регистра АН в регистр флагов процессора, устанавливая тем самым значения флагов SF, ZF, AF, PF и CF соответственно. Команда не имеет операндов.
Команда sahf (совместно с командой lahf) дает возможность читать и изменять значения флагов процессора, в том числе флагов SF, ZF, AF и PF, которые нельзя изменить непосредственно. Однако следует иметь в виду, что команда sahf заполняет только младший байт регистра флагов, поэтому нельзя изменить с ее помощью состояние флага OF
Команды обработки строк
/*Команды обработки строк (цепочечные команды) позволяют производить действия над блоками байтов или слов памяти. Эти блоки (или строки) могут иметь длину до 64 Кбайт и состоять из числовых или алфавитно-цифровых значений (типа символов в кодах ASCII) и быть следующего размера: 8 бит — байт; 16 бит — слово; 32 бита — двойное слово. Всего в системе команд микропроцессора имеется семь операций-примитивов обработки цепочек. Каждая из них реализуется в микропроцессоре тремя командами, в свою очередь, каждая из этих команд работает с соответствующим размером элемента — байтом, словом или двойным словом. Особенность всех цепочечных команд в том, что они, кроме обработки текущего элемента цепочки, осуществляют еще и автоматическое продвижение к следующему. Предполагается, что строка-приемник находится в дополнительном сегменте ES, а строка-источник – в сегменте данных DS. Процессор адресует строку-приемник через регистр EDI/DI, а строку-источник – через регистр ESI/SI. Перед выполнением команд нyжно обеспечить, чтобы эти регистры содержали смещение первых обрабат. элементов обеих строк относительно начала соответствующего сегмента. => LEA регистр, память
Если обе строки находятся в сегменте данных, то необходимо в регистр ES поместить адрес начала сегмента данных, т.е. значение, находящееся в регистре DS.
Если флаг DF равен 0, то значения регистров ESI/EI и EDI/DI увеличиваются после исполнения каждой команды. Если флаг DF равен 1, то они уменьшаются. Состоянием флага DF можно управлять с помощью двух команд: CLD – сбросить флаг направления, которая полагает его равным нулю, STD – установить флаг направления, которая присваивает ему значение 1.*/
1. Префиксы повторения
Нужны , чтобы одна команда обработки строк обработала группу последовательных элементов памяти. Для этого перед ней надо указать префикс повторения REP.Он представляет собой не команду, а однобайтовый модификатор, который заставляет микропроцессор 8088 выполнить аппаратные повторения команды обработки строк. Это значительно сокращает время на обработку длинных строк по сравнению с программно-организованными циклами. Число повторений извлекается из регистра СХ. После очередного выполнения команды значение в регистре СХ уменьшается на единицу. Отличия префиксов в том, на каком основании принимается решение о циклическом выполнении цепочечной команды: по состоянию регистра ecx/cx или по флагу нуля zf.
Префикс повторения rep (REPeat).
Этот префикс используется с командами, реализующими операции-примитивы пересылки и сохранения элементов цепочек — соответственно, movs и stos, (ins и outs). Префикс repзаставляет данные команды выполняться, пока содержимое в ecx/cx не станет равным 0. При этом цепочечная команда, перед которой стоит префикс, автоматически уменьшаетсодержимое ecx/cx на единицу.
Действия rep:
1. анализ содержимого cx:
если cx<>0, то выполнить цепочечную команду, следующую за данным префиксом и перейти к шагу 2;
если cx=0, то передать управление команде, следующей за данной цепочечной командой (выйти из цикла по rep);
2.уменьшить значение cx=cx–1 и вернуться к шагу 1;