Индексную базовую базово-индексную

Индексная

При задании адреса используется один из индексных регистров 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).

Циклические

Циклические сдвиги позволяют сдвигать биты кода операнда по кругу (по часовой стрелке при сдвиге вправо или против часовой стрелки при сдвиге влево). При этом в кольцо сдвига может входить или не входить флаг переноса.

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

Арифметические

Индексную базовую базово-индексную - student2.ru Индексную базовую базово-индексную - student2.ru

Для сдвига влево

если of=1, то текущее значение флагаcf и выдвигаемого слева бита операнда различны;
если of=0, то текущее значение флага cf и выдвигаемого слева бита операнда совпадают

Логические

Индексную базовую базово-индексную - student2.ru Индексную базовую базово-индексную - student2.ru

Для сдвигов вправо

Флаг of всегда сбрасывается в ноль в операциях сдвига на один разряд

Циклические

Индексную базовую базово-индексную - student2.ru Индексную базовую базово-индексную - student2.ru

Особенность этого сдвига в том, что он происходит с некоторой задержкой, так как очередной сдвигаемый бит оказывается на некоторое время вне операнда.

Индексную базовую базово-индексную - student2.ru Индексную базовую базово-индексную - student2.ru

Отличие этого сдвига от 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;

Наши рекомендации