Операции над битами и байтами — КиберПедия 

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Операции над битами и байтами

2021-04-18 97
Операции над битами и байтами 0.00 из 5.00 0 оценок
Заказать работу

· Команда: BT база, смещение
· Назначение: Проверка бита
· Процессор: 80386

Команда ВТ считывает во флаг CF значение бита из битовой строки, указанной первым операндом, битовой базой (регистр или переменная), со смещением, указанным во втором операнде, битовом смещении (число или регистр). Если первый операнд — регистр, то битовой базой считается бит 0 в указанном регистре и смещение не может превышать 15 или 31 (в зависимости от размера регистра); если оно превышает эти границы, в качестве смещения будет использован остаток от деления его на 16 или 32 соответственно. Если первый операнд — переменная, то в качестве битовой базы используется бит 0 указанного байта в памяти, а смещение может принимать значения от 0 до 31, если оно указано непосредственно (старшие биты процессором игнорируются), и от -231 до 231–1, если оно указано в регистре.

Примечание: Несмотря на то что эта команда считывает единственный бит из памяти, процессор считывает целое двойное слово по адресу База+(4*(Смещение/32)) или слово по адресу База+(2*(Смещение/16)), в зависимости от разрядности адреса, так что не следует пользоваться ВТ вблизи от не доступных для чтения областей памяти.

После выполнения команды ВТ флаг CF равен значению считанного бита, флаги OF, SF, ZF, AF и PF не определены.

· Команда: BTS база, смещение
· Назначение: Проверка и установка бита
· Команда: BTR база, смещение
· Назначение: Проверка и сброс бита
· Команда: BTC база, смещение
· Назначение: Проверка и инверсия бита
· Процессор: 80386

Эти три команды соответственно устанавливают в 1 (BTS), сбрасывают в 0 (ВТR) и инвертируют (ВТС) значение бита, который находится в битовой строке с началом, указанным в базе (регистр или переменная), и смещением, указанным во втором операнде (число от 0 до 31 или регистр). Если битовая база — регистр, то смещение не может превышать 15 или 31 в зависимости от разрядности этого регистра. Если битовая база — переменная в памяти, то смещение может принимать значения от -231 до 231–1 (если оно указано в регистре).

После выполнения команд BTS, BTR и ВТС флаг CF равен значению считанного бита до его изменения в результате действия команды, флаги OF, SF, ZF, AF и PF не определены.

· Команда: BSF приемник, источник
· Назначение: Прямой поиск бита
· Команда: BSR база, смещение
· Назначение: Обратный поиск бита
· Процессор: 80386

BSF сканирует источник (регистр или переменная), начиная с самого младшего бита, и записывает в приемник (регистр) номер первого встретившегося бита, равного 1. Команда BSR сканирует источник, начиная с самого старшего бита, и возвращает номер первого встретившегося ненулевого бита, считая от нуля, то есть, если источник равен 0100 0000 0000 0010b, то BSF возвратит 1 a BSR — 14.

Если весь источник равен нулю, значение приемника не определено и флаг ZF устанавливается в 1, иначе ZF всегда сбрасывается. Флаги CF, OF, SF, AF и PF не определены.

· Команда: SETcc приемник
· Назначение: Установка байта по условию
· Процессор: 80386

Это набор команд, которые устанавливают приемник (восьмибитный регистр или переменная размером в один байт) в 1 или 0, если удовлетворяется или не удовлетворяется определенное условие. Условием в каждом случае реально является состояние тех или иных флагов, но, если команда из набора SETcc используется сразу после СМР, условия приобретают формулировки, соответствующие отношениям между операндами СМР (см. табл. 6). Скажем, если операнды СМР были неравны, то команда SETNE, выполненная сразу после этого СМР, установит значение своего операнда в 1.

Слова «выше» и «ниже» в таблице относятся к сравнению чисел без знака, слова «больше» и «меньше» учитывают знак.

 

Таблица 6. Команды SETcc

 

Код команды Реальное условие Условие для CMP
SETA SETNBE CF = 0 и ZF = 0 если выше если не ниже или равно
SETAE SETNB SETNC CF = 0 если выше или равно если не ниже если нет переноса
SETB SETNAE SETC CF = 1 если ниже если не выше или равно если перенос
SETBE SETNA CF = 1 и ZF = 1 если ниже или равно если не выше
SETE SETZ ZF = 1 если равно если ноль
SETG SETNLE ZF = 0 и SF = OF если больше если не меньше или равно
SETGE SETNL SF = OF если больше или равно если не меньше
SETL SETNGE SF <> OF если меньше если не больше или равно
SETLE SETNG ZF = 1 и SF <> OF если меньше или равно если не больше
SETNE SETNZ ZF = 0 если не равно если не ноль
SETNO OF = 0 если нет переполнения
SETO OF = 1 если есть переполнение
SETNP SETPO PF = 0 если нет четности если нечетное
SETP SETPE PF = 1 если есть четность если четное
SETNS SF = 0 если нет знака
SETS SF = 1 если есть знак

Команды передачи управления

· Команда: JMP операнд
· Назначение: Безусловный переход
· Процессор: 8086

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

В зависимости от типа перехода различают:

  • переход типа short (короткий переход) — если адрес перехода находится в пределах от -127 до +128 байт от команды JMP;
  • переход типа near (ближний переход) — если адрес перехода находится в том же сегменте памяти, что и команда JMP;
  • переход типа far (дальний переход) — если адрес перехода находится в другом сегменте. Дальний переход может выполняться и в тот же самый сегмент, если в сегментной части операнда указано число, совпадающее с текущим значением CS;
  • переход с переключением задачи — передача управления другой задаче в многозадачной среде. Этот вариант будет рассмотрен в главе, посвященной защищенному режиму.

При выполнении переходов типа short и near команда JMP фактически изменяет значение регистра EIP (или IP), изменяя тем самым смещение следующей исполняемой команды относительно начала сегмента кода. Если операнд — регистр или переменная в памяти, то его значение просто копируется в EIP, как если бы это была команда MOV. Если операнд для JMP — непосредственно указанное число, то его значение суммируется с содержимым EIP, приводя к относительному переходу. В ассемблерных программах в качестве операнда обычно указывают имена меток, но на уровне исполнимого кода ассемблер вычисляет и записывает именно относительные смещения.

Выполняя дальний переход в реальном режиме, виртуальном режиме и в защищенном режиме (при переходе в сегмент с теми же привилегиями), команда JMP просто загружает новое значение в EIP и новый селектор сегмента кода в CS, используя старшие 16 бит операнда как новое значение для CS и младшие 16 или 32 — как значение IP или EIP.

· Команда: Jcc метка
· Назначение: Условный переход
· Процессор: 8086

Это набор команд, каждая из которых выполняет переход (типа short или near), если удовлетворяется соответствующее условие. Условием в каждом случае реально является состояние тех или иных флагов, но, если команда из набора Jcc используется сразу после СМР, условия приобретают формулировки, соответствующие отношениям между операндами СМР (см. табл. 7). Например, если операнды СМР были равны, то команда JE, выполненная сразу после этого СМР, осуществит переход. Операнд для всех команд из набора Jcc — 8-битное или 32-битное смешение относительно текущей команды.

Слова «выше» и «ниже» в таблице относятся к сравнению чисел без знака, слова «больше» и «меньше» учитывают знак.

 

Таблица 7. Варианты команды Jcc

 

Код команды Реальное условие Условие для CMP
JA JNBE CF = 0 и ZF = 0 если выше если не ниже или равно
JAE JNB JNC CF = 0 если выше или равно если не ниже если нет переноса
JB JNAE JC CF = 1 если ниже если не выше или равно если перенос
JBE JNA CF = 1 и ZF = 1 если ниже или равно если не выше
JE JZ ZF = 1 если равно если ноль
JG JNLE ZF = 0 и SF = OF если больше если не меньше или равно
JGE JNL SF = OF если больше или равно если не меньше
JL JNGE SF <> OF если меньше если не больше или равно
JLE JNG ZF = 1 и SF <> OF если меньше или равно если не больше
JNE JNZ ZF = 0 если не равно если не ноль
JNO OF = 0 если нет переполнения
JO OF = 1 если есть переполнение
JNP JPO PF = 0 если нет четности если нечетное
JP JPE PF = 1 если есть четность если четное
JNS SF = 0 если нет знака
JS SF = 1 если есть знак

 

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

cmp ах,0 jne local_1 jmp far_label; переход, если АХ = 0lосаl_1:
· Команда: JCXZ метка
· Назначение: Переход, если СХ = 0
· Процессор: 8086
· Команда: JECXZ метка
· Назначение: Переход, если EСХ = 0
· Процессор: 80386

Выполняет ближний переход на указанную метку, если регистр CX или ECX (для JCXZ и JECXZ соответственно) равен нулю. Так же как и команды из серии Jcc, JCXZ и JECXZ не могут выполнять дальних переходов. Проверка равенства СХ нулю, например, может потребоваться в начале цикла, организованного командой LOOPNE, — если в него войти с СХ = 0, то он будет выполнен 65 535 раз.

· Команда: LOOP метка
· Назначение: Цикл
· Процессор: 8086

Уменьшает регистр ЕСХ на 1 и выполняет переход типа short на метку (которая не может быть дальше, чем на расстоянии от -128 до +127 байт от команды LOOP), если ЕСХ не равен нулю. Эта команда используется для организации циклов, в которых регистр ЕСХ (или СХ при 16-битной адресации) играет роль счетчика. Так, в следующем фрагменте команда ADD выполнится 10 раз:

       mov cx,0Ahloop_start: add ax,cx       loop loop_start

Команда LOOP полностью эквивалентна паре команд

       dec ecx       jz метка

Но LOOP короче этих двух команд на один байт и не изменяет значения флагов.

· Команда: LOOPE метка
· Назначение: Цикл, пока равно
· Команда: LOOPZ метка
· Назначение: Цикл, пока ноль
· Команда: LOOPNE метка
· Назначение: Цикл, пока не равно
· Команда: LOOPNZ метка
· Назначение: Цикл, пока не ноль
· Процессор: 8086

Все эти команды уменьшают регистр ЕСХ на один, после чего выполняют переход типа short, если ЕСХ не равен нулю и если выполняется условие. Для команд LOOPE и LOOPZ условием является равенство единице флага ZF, для команд LOOPNE и LOOPNZ — равенство флага ZF нулю. Сами команды LOOPcc не изменяют значений флагов, так что ZF должен быть установлен (или сброшен) предшествующей командой. Например, следующий фрагмент копирует строку из DS:SI в строку в ES:DI (см. описание команд работы со строками), пока не кончится строка (СХ = 0) или пока не встретится символ с ASCII-кодом 13 (конец строки):

      mov cx,str_lengthmove_loop:      stosb      lodsb      cmp al,13           loopnz move_loop
· Команда: CALL операнд
· Назначение: Вызов процедуры
· Процессор: 8086

Сохраняет текущий адрес в стеке и передает управление по адресу, указанному в операнде. Операндом может быть непосредственное значение адреса (метка в ассемблерных программах), регистр или переменная, содержащие адрес перехода. Если в качестве адреса перехода указано только смещение, считается, что адрес расположен в том же сегменте, что и команда CALL. При этом, так же как и в случае с JMP, выполняется ближний вызов процедуры. Процессор помещает значение регистра EIP (IP при 16-битной адресации), соответствующее следующей за CALL команде, в стек и загружает в EIP новое значение, осуществляя тем самым передачу управления. Если операнд CALL — регистр или переменная, то его значение рассматривается как абсолютное смещение, если операнд — метка в программе, то ассемблер указывает ее относительное смещение. Чтобы осуществить дальний CALL в реальном режиме, режиме V86 или в защищенном режиме при переходе в сегмент с теми же привилегиями, процессор помещает в стек значения регистров CS и EIP (IP при 16-битной адресации) и выполняет дальний переход аналогично команде JMP.

· Команда: RET число RETN число RETF число
· Назначение: Возврат из процедуры
· Процессор: 8086

RETN считывает из стека слово (или двойное слово, в зависимости от режима адресации) и загружает его в IP (или EIP), выполняя тем самым действия, обратные ближнему вызову процедуры командой, CALL. RETF соответственно загружает из стека IP (EIP) и CS, возвращаясь из дальней процедуры. Если в ассемблерной программе указана команда RET, ассемблер заменит ее на RETN или RETF в зависимости от того, как была описана процедура, которую эта команда завершает. Операнд для RET необязателен, но, если он присутствует, после считывания адреса возврата из стека будет удалено указанное количество байт — это бывает нужно, если при вызове процедуры ей передавались параметры через стек.

· Команда: INT число
· Назначение: Вызов прерывания
· Процессор: 8086

INT помещает в стек содержимое регистров EFLAGS, CS и EIP, после чего передает управление программе, называемой «обработчик прерывания» с указанным в качестве операнда номером (число от 0 до 0FFh), аналогично команде CALL. В реальном режиме адреса обработчиков прерываний считываются из таблицы, начинающейся в памяти по адресу 0000h:0000h. Адрес каждого обработчика занимает 4 байта, так что, например, адрес обработчика прерывания 10h находится в памяти по адресу 0000h:0040h. В защищенном режиме адреса обработчиков прерываний находятся в таблице IDT и обычно недоступны для прямого чтения или записи, так что для установки собственного обработчика программа должна обращаться к операционной системе. В DOS вызовы прерываний используются для выполнения большинства системных функций — работы с файлами, вводом/выводом и т.д. Например, следующий фрагмент кода завершает выполнение программы и возвращает управление DOS:

mov ax,4C01h int 21h
· Команда: IRET IRETD
· Назначение: Возврат из обработчика прерывания
· Процессор: 8086

Возврат управления из обработчика прерывания или исключения. IRЕТ загружает из стека значения IP, CS и FLAGS, a IRETD — EIP, CS и EFLAGS соответственно. Единственное отличие IRET от RETF состоит в том, что восстанавливается значение регистра флагов, из-за чего многим обработчикам прерываний приходится изменять значение EFLAGS, находящегося в стеке, чтобы, например, вернуть флаг CF установленным в случае ошибки.

· Команда: INT3
· Назначение: Вызов прерывания 3
· Процессор: 8086

Размер этой команды — один байт (код 0CCh), что делает ее удобной для отладки программ отладчиками, работающими в реальном режиме. Такие отладчики записывают этот байт вместо первого байта команды, перед которой требуется точка останова, и переопределяют адрес обработчика прерывания 3 на соответствующую процедуру внутри отладчика.

· Команда: INTO
· Назначение: Вызов прерывания 4 при переполнении
· Процессор: 8086

INTO — еще одна специальная форма команды INT. Эта команда вызывает обработчик прерывания 4, если флаг OF установлен в 1.

· Команда: BOUND индекс, границы
· Назначение: Проверка выхода за границы массива
· Процессор: 80186

BOUND проверяет, не выходит ли значение первого операнда (регистр), взятое как число со знаком, за границы, указанные во втором операнде (переменная). Границы — два слова или двойных слова (в зависимости от разрядности операндов), рассматриваемые как целые со знаком, расположенные в памяти подряд. Первая граница считается нижней, вторая — верхней. Если индекс меньше нижней границы или больше верхней, вызывается прерывание 5 (или исключение #BR), причем адрес возврата указывает не на следующую команду, а на BOUND, так что обработчик должен исправить значение индекса или границ, прежде чем выполнять команду IRET.

· Команда: ENTER размер, уровень
· Назначение: Вход в процедуру
· Процессор: 80186

Команда ENTER создает стековый кадр заданного размера и уровня вложенности (оба операнда — числа; уровень вложенности может принимать значения только от 0 до 31) для вызова процедуры, использующей динамическое распределение памяти в стеке для своих локальных переменных. Так, команда

enter 2048,3

помещает в стек указатели на стековый кадр текущей процедуры и той, из которой вызывалась текущая, создает стековый кадр размером 2 килобайта для вызываемой процедуры и помещает в ЕВР адрес начала кадра. Пусть процедура MAIN имеет уровень вложенности 0, процедура PROCA запускается из MAIN и имеет уровень вложенности 1, и PROCB запускается из PROCA с уровнем вложенности 2. Тогда стек при входе в процедуру MAIN имеет вид, показанный на рис. 10.

 

      ЕВР

     Старый EBP               

            

        EBP для main

             

              

         локальные              

 

         переменные              ESP

         для MAIN

 

         Рис. 10. Стековый кадр процедуры 0-го уровня (MAIN)

 

На первом уровне вложенности процедура PROCA, как показано на рис. 11, может создавать свои локальные переменные, используя текущее значение EBP, и получает доступ к локальным переменным процедуры MAIN, используя значение ЕВР для MAIN, помещенное в стек командой ENTER.

 

                                   

                                                                                                                              

                                                                          

     Старый EBP                      Старый EBP

                                                                                 EBP для MAIN                 

        EBP для main                                                    

                                                                        

                                      Локальные

         локальные                                                   

                                           переменные

         переменные              для MAIN

         для MAIN                                         

                                       EBP для MAIN

       EBP для main            EBP EBP для MAIN

       EBP для main                   EBP для PROCA

       EBP для PROCA                  Локальные

                                                                             

        локальные                переменные

                                           для PROCA

         переменные              EBP для PROCA             EBP   

         для PROCA             ESP EBP для MAIN     

                                     EBP для PROCA    

      Рис 11. Стековый кадр        EBP для PROCB          

         процедуры 1-го       Локальные              

              уровня (PROCA)     переменные                   

                                           для PROCB            ESP             

                                           Рис.12 Стековый кадр

                                      процедуры 2-го уровня (PROCB)

Процедура PROCB на втором уровне вложенности (рис. 12) получает доступ как к локальным переменным процедуры PROCA, используя значение ЕВР для PROCA, так и к локальным переменным процедуры МАIN, используя значение ЕВР для MAIN.

· Команда: LEAVE
· Назначение: Выход из процедуры
· Процессор: 80186

Команда LEAVE выполняет действия, обратные команде ENTER. Фактически эта команда только копирует содержимое ЕВР в ESP, тем самым выбрасывая из стека весь кадр, созданный последней выполненной командой ENTER, и считывает из стека ЕВР для предыдущей процедуры, что одновременно восстанавливает и значение, которое имел ESP до вызова последней команды ENTER.

Строковые операции

Все команды для работы со строками считают, что строка-источник находится по адресу DS:SI (или DS:ESI), то есть в сегменте памяти, указанном в DS со смещением в SI, а строка-приемник — соответственно в ES:DI (или ES:EDI). Кроме того, все строковые команды работают только с одним элементом строки (байтом, словом или двойным словом) за один раз. Для того чтобы команда выполнялась над всей строкой, необходим один из префиксов повторения операций.

· Префикс: REP
· Назначение: Повторять
· Префикс: REPE
· Назначение: Повторять, пока равно
· Префикс: REPNE
· Назначение: Повторять, пока не равно
· Префикс: REPZ
· Назначение: Повторять, пока ноль
· Префикс: REPNZ
· Назначение: Повторять, пока не ноль
· Процессор: 8086

Все эти команды — префиксы для операций над строками. Любой из префиксов выполняет следующую за ним команду строковой обработки столько раз, сколько указано в регистре ЕСХ (или СХ, в зависимости от разрядности адреса), уменьшая его при каждом выполнении команды на 1. Кроме того, префиксы REPZ и REPE прекращают повторения команды, если флаг ZF сброшен в 0, и префиксы REPNZ и REPNE прекращают повторения, если флаг ZF установлен в 1. Префикс REP обычно используется с командами INS, OUTS, MOVS, LODS, STOS, а префиксы REPE, REPNE, REPZ и REPNZ — с командами CMPS и SCAS. Поведение префиксов не с командами строковой обработки не определено.

· Команда: MOVS приемник, источник
· Назначение: Копирование строки
· Процессор: 8086
· Команда: MOVSB
· Назначение: Копирование строки байт
· Процессор: 8086
· Команда: MOVSW
· Назначение: Копирование строки слов
· Процессор: 8086
· Команда: MOVSD
· Назначение: Копирование строки двойных слов
· Процессор: 80386

Копирует один байт (MOVSB), слово (MOVSW) или двойное слово (MOVSD) из памяти по адресу DS:ESI (или DS:SI, в зависимости от разрядности адреса) в память по адресу ES:EDI (или ES:DI). При использовании формы записи MOVS ассемблер сам определяет из типа указанных операндов (принято указывать имена копируемых строк, но можно использовать любые два операнда подходящего типа), какую из трех форм этой команды (MOVSB, MOVSW или MOVSD) выбрать. Используя MOVS с операндами, можно заменить регистр DS на другой с помощью префикса замены сегмента (ES:, GS:, FS:, CS:, SS:), регистр ES заменить нельзя. После выполнения команды регистры ESI (SI) и EDI (DI) увеличиваются на 1, 2 или 4 (если копируются байты, слова или двойные слова), если флаг DF = 0, и уменьшаются, если DF = 1. При использовании с префиксом REP команда MOVS выполняет копирование строки длиной в ЕСХ (или СХ) байт, слов или двойных слов.

· Команда: CMPS приемник, источник
· Назначение: Сравнение строк
· Процессор: 8086
· Команда: CMPSB
· Назначение: Сравнение строк байт
· Процессор: 8086
· Команда: CMPSW
· Назначение: Сравнение строк слов
· Процессор: 8086
· Команда: CMPSD
· Назначение: Сравнение строк двойных слов
· Процессор: 80386

Сравнивает один байт (CMPSB), слово (CMPSW) или двойное слово (CMPSD) из памяти по адресу DS:ESI (или DS:SI, в зависимости от разрядности адреса) с байтом, словом или двойным словом по адресу ES:EDI (или ES:DI) и устанавливает флаги аналогично команде СМР. При использовании формы записи CMPS ассемблер сам определяет из типа указанных операндов (принято указывать имена сравниваемых строк, но можно использовать любые два операнда подходящего типа), какую из трех форм этой команды (CMPSB, CMPSW или CMPSD) выбрать. Используя CMPS с операндами, можно заменить регистр DS на другой, применяя префикс замены сегмента (ES:, GS:, FS:, CS:, SS:), регистр ES заменить нельзя. После выполнения команды регистры ESI (SI) и EDI (DI) увеличиваются на 1, 2 или 4 (если сравниваются байты, слова или двойные слова), если флаг DF = 0, и уменьшаются, если DF = 1. При использовании с префиксом REP команда CMPS выполняет сравнение строки длиной в ЕСХ (или СХ) байт, слов или двойных слов, но чаще ее используют с префиксами REPNE/REPNZ или REPE/REPZ. В первом случае сравнение продолжается до первого несовпадения в сравниваемых строках, а во втором — до первого совпадения.

· Команда: SCAS приемник
· Назначение: Сканирование строки
· Процессор: 8086
· Команда: SCASB
· Назначение: Сканирование строки байт
· Процессор: 8086
· Команда: SCASW
· Назначение: Сканирование строки слов
· Процессор: 8086
· Команда: SCASD
· Назначение: Сканирование строки двойных слов
· Процессор: 80386

Сравнивает содержимое регистра AL (SCASB), AX (SCASW) или ЕАХ (SCASD) с байтом, словом или двойным словом из памяти по адресу ES:EDI (или ES:DI, в зависимости от разрядности адреса) и устанавливает флаги аналогично команде СМР. При использовании формы записи SCAS ассемблер сам определяет из типа указанного операнда (принято указывать имя сканируемой строки, но можно использовать любой операнд подходящего типа), какую из трех форм этой команды (SCASB, SCASW или SCASD) выбрать. После выполнения команды регистр EDI (DI) увеличивается на 1, 2 или 4 (если сканируются байты, слова или двойные слова), если флаг DF = 0, и уменьшается, если DF = 1. При использовании с префиксом REP команда SCAS выполняет сканирование строки длиной в ЕСХ (или СХ) байт, слов или двойных слов, но чаще ее используют с префиксами REPNE/REPNZ или REPE/REPZ. В первом случае сканирование продолжается до первого элемента строки, отличного от содержимого аккумулятора, а во втором — до первого совпадающего.

· Команда: LODS источник
· Назначение: Чтение из строки
· Процессор: 8086
· Команда: LODSB
· Назначение: Чтение байта из строки
· Процессор: 8086
· Команда: LODSW
· Назначение: Чтение слова из строки
· Процессор: 8086
· Команда: LODSD
· Назначение: Чтение двойного слова из строки
· Процессор: 80386

Копирует один байт (LODSB), слово (LODSW) или двойное слово (LODSD) из памяти по адресу DS:ESI (или DS:SI, в зависимости от разрядности адреса) в регистр AL, АХ или ЕАХ соответственно. При использовании формы записи LODS ассемблер сам определяет из типа указанного операнда (принято указывать имя строки, но можно использовать любой операнд подходящего типа), какую из трех форм этой команды (LODSB, LODSW или LODSD) выбрать. Используя LODS с операндом, можно заменить регистр DS на другой с помощью префикса замены сегмента (ES:, GS:, FS:, CS:, SS:). После выполнения команды регистр ESI (SI) увеличивается на 1, 2 или 4 (если считывается байт, слово или двойное слово), если флаг DF = 0, и уменьшается, если DF = 1. При использовании с префиксом REP команда LODS выполнит копирование строки длиной в ЕСХ (или СХ), что приведет к тому, что в аккумуляторе окажется последний элемент строки. На самом деле эту команду используют без префиксов, часто внутри цикла в паре с командой STOS, так что LODS считывает число, другие команды выполняют над ним какие-нибудь действия, а затем STOS записывает измененное число в то же место в памяти.

· Команда: STOS приемник
· Назначение: Запись в строку
· Процессор: 8086
· Команда: STOSB
· Назначение: Запись байта в строку
· Процессор: 8086
· Команда: STOSW
· Назначение: Запись слова в строку
· Процессор: 8086
· Команда: STOSD
· Назначение: Запись двойного слова в строку
· Процессор: 80386

Копирует регистр AL (STOSB), AX (STOSW) или ЕАХ (STOSD) в память по адресу ES:EDI (или ES:DI, в зависимости от разрядности адреса). При использовании формы записи STOS ассемблер сам определяет из типа указанного операнда (принято указывать имя строки, но можно использовать любой операнд подходящего типа), какую из трех форм этой команды (STOSB, STOSW или STOSD) выбрать. После выполнения команды регистр EDI (DI) увеличивается на 1, 2 или 4 (если копируется байт, слово или двойное слово), если флаг DF = 0, и уменьшается, если DF = 1. При использовании с префиксом REP команда STOS заполнит строку длиной в ЕСХ (или СХ) числом, находящимся в аккумуляторе.

· Команда: INS источник, DX
· Назначение: Чтение строки из порта
· Процессор: 80186
· Команда: INSB
· Назначение: Чтение строки байт из порта
· Процессор: 80186
· Команда: INSW
· Назначение: Чтение строки слов из порта
· Процессор: 80186
· Команда: INSD
· Назначение: Чтение строки двойных слов из порта
· Процессор: 80386

Считывает из порта ввода-вывода, номер которого указан в регистре DX, байт (INSB), слово (INSW) или двойное слово (INSD) в память по адресу ES:EDI (или ES:DI, в зависимости от разрядности адреса). При использовании формы записи INS ассемблер определяет из типа указанного операнда, какую из трех форм этой команды (INSB, INSW или INSD) употребить. После выполнения команды регистр EDI (DI) увеличивается на 1, 2 или 4 (если считывается байт, слово или двойное слово), если флаг DF = 0, и уменьшается, если DF = 1. При использовании с префиксом REP команда INS считывает блок данных из порта длиной в ЕСХ (или СХ) байт, слов или двойных слов.

· Команда: OUTS DX, приемник
· Назначение: Запись строки в порт
· Процессор: 80186
· Команда: OUTSB
· Назначение: Запись строки байт в порт
· Процессор: 80186
· Команда: OUTSW
· Назначение: Запись строки слов в порт
· Процессор: 80186
· Команда: OUTSD
· Назначение: Запись строки двойных слов в порт
· Процессор: 80386

Записывает в порт ввода-вывода, номер которого указан в регистре DX, байт (OUTSB), слово (OUTSW) или двойное слово (OUTSD) из памяти по адресу DS:ESI (или DS:SI, в зависимости от разрядности адреса). При использовании формы записи OUTS ассемблер определяет из типа указанного операнда, какую из трех форм этой команды (OUTSB, OUTSW или OUTSD) употребить. Используя OUTS с операндами, также можно заменить регистр DS на другой с помощью префикса замены сегмента (ES:, GS:, FS:, CS:, SS:). После выполнения команды регистр ESI (SI) увеличивается на 1, 2 или 4 (если считывается байт, слово или двойное слово), если флаг DF = 0, и уменьшается, если DF = 1. При использовании с префиксом REP команда OUTS записывает блок данных размером в ЕСХ (или СХ) байт, слов или двойных слов в указанный порт. Все процессоры вплоть до Pentium не проверяли готовность порта принять новые данные в ходе выполнения команды REP OUTS, так что, если порт не успевал обрабатывать информацию с той скоростью, с которой ее поставляла эта команда, часть данных терялась.

Управление флагами

· Команда: STC
· Назначение: Установить флаг переноса
· Процессор: 8086

Устанавливает флаг CF в 1.

· Команда: CLC
· Назначение: Сбросить флаг переноса
· Процессор: 8086

Сбрасывает флаг CF в 0.

· Команда: CMC
· Назначение: Инвертировать флаг переноса
· Процессор: 8086

Инвертирует флаг СF.

· Команда: STD
· Назначение: Установить флаг направления
· Процессор: 8086

Устанавливает флаг DF в 1, так что при последующих строковых операциях регистры DI и SI будут уменьшаться.

· Команда: CLD
· Назначение: Сбросить флаг направления
· Процессор: 8086

Сбрасывает флаг DF в 0, так что при последующих строковых операциях регистры DI и SI будут увеличиваться.

· Команда: LAHF
· Назначение: Загрузить флаги состояния в АН
· Процессор: 8086

Копирует младший байт регистра FLAGS в АН, включая флаги SF (бит 7), ZF (бит 6), AF (бит 4), PF (бит 2) и CF (бит 0). Бит 1 устанавливается в 1, бит


Поделиться с друзьями:

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.069 с.