Знакомство с порядком описания команд и принятыми обозначениями 2 страница



11 07 06 04 02 00
OF SF ZF AF PF CF
r r r r r r

Применение:

Команда add используется для сложения двух целочисленных операндов. Результат сложения помещается по адресу первого операнда. Если результат сложения выходит за границы операнда приемник (возникает переполнение), то учесть эту ситуацию следует путем анализа флага cf и последующего возможного применения команды adc. Например, сложим значения в регистре ax и области памяти ch. При сложении следует учесть возможность переполнения.

chiclo dw 2015rez dd 0... add ax,chislo ;(ax)=(ax)+ch mov word ptr rez,ax jnc dop_sum ;переход, если результат не вышел за разрядную сетку adc word ptr rez+2,0 ;расширить результат, для учета переноса ;в старший разрядdop_sum:...

См. также: урок 8, Приложение 7 и команды adc, sub, sbb, xadd

AND

(logical AND)

Логическое И

 

Схема команды: and приемник,источник

Назначение: операция логического умножения для операндов приемник и источник размерностью байт, слово или двойное слово.

Синтаксис

Алгоритм работы:

  • выполнить операцию логического умножения над операндами источник и приемник: каждый бит результата равен 1, если соответствующие биты операндов равны 1, в остальных случаях бит результата равен 0;
  • записать результат операции в приемник;
  • установить флаги.

Состояние флагов после выполнения команды:

11 07 06 02 00
OF SF ZF PF CF
0 r r r 0

Применение:

Команда and используется для логического умножения двух операндов. Результат операции помещается по адресу первого операнда. Эту команду удобно использовать для принудительной установки или сброса определенных битов операнда.

Например, преобразуем двузначное упакованное BCD-число в его символьный эквивалент.

u_BCD db 25h ;упакованное BCD-числоs_ch dw 0 ;место для результата... xor ax,ax ;очистка ax mov al,u_BCD shl ax,4 ;ax=0250 mov al,u_BCD ;ax=0225;преобразование в символьное представление: and ax,3f3fh ;ax=3235h mov s_ch,ax

См. также: уроки 9, 12 и команды or, xor, test

BOUND

(check array BOUNDs)

Контроль нахождения индекса массива в границах

 

Схема команды: bound индекс,границы массива

Назначение: проверка нахождения значения индекса в границах массива.

Синтаксис

Алгоритм работы:

Cравнить значение в регистре индекс с двумя значениями, расположенными последовательно в ячейке памяти, адресуемой операндом границы массива. Диапазон значений индекса определяется используемым регистром индекс:

  • если это 16-разрядный регистр общего назначения, то содержащееся в нем значение проверяется на попадание в диапазон значений, которые находятся в двух последовательных словах в памяти по адресу, указываемому вторым операндом. Эти два значения являются, соответственно, значениями нижнего и верхнего индекса границы массива;
  • если это 32-разрядный регистр общего назначения, то содержащееся в нем значение проверяется на попадание в диапазон значений, которые находятся в двух последовательных двойных словах в памяти по адресу, указываемому вторым операндом. Эти два значения являются, соответственно, значениями нижнего и верхнего индекса границы массива;

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

Состояние флагов после выполнения команды:

выполнение команды не влияет на флаги  

Применение:

Команду bound очень удобно использовать для контроля выхода за нижнюю или верхнюю границы массива. Значения этих границ должны быть предварительно помещены в два последовательных слова (двойных слова) в памяти. Адрес этих слов (двойных слов) указывается вторым операндом. Далее динамически в ходе работы программы значение в регистре индекс, указываемом первым операндом, сравнивается со значениями этих двух границ, и если нижняя_граница<=(индексindex)<=верхняя_граница, то программа продолжает выполнение. В противном случае генерируется исключительная ситуация 5 (int 5). Далее в программе обработки этой ситуации можно выполнить необходимую корректировку и вернуться в программу (см. урок 17).

Фрагмент, который можно использовать при обработке одномерного массива с размерностью элементов в слово:

.286 ;это обязательная директива, так как bound ;входит в систему команд микропроцессоров, начиная с i286.dataBoundMas label wordLow_Bound dw 0Upp_Bound dw 20mas dw 10 dup (?)... xor di,di ;очистка индексного регистраcycl: mov ax,mas[di] ;переборэлементов массива add di,2 bound di,BoundMas;если значение в di не будет попадать в границы, то будет вызван;обработчик прерывания 5, где можно скорректировать;значение ip/eip в стеке с тем, чтобы выйти;из бесконечного ;цикла, например, на метку М2 или;выполнить другие действия jmp cyclМ2:...

См. также: урок 17 и команду iret/iretd

BSF

(Bit Scan Forward)

Побитное сканирование вперед

 

Схема команды: bsf результат,источник

Назначение: для проверки наличия единичных битов в операнде источник.

Синтаксис

Алгоритм работы:

  • просмотр битов операнда источник, начиная с бита 0 и заканчивая битом 15/31, до тех пор, пока не встретится единичный бит;
  • если встретился единичный бит, то флаг zf устанавливается в 0 и в регистр первого операнда записывается номер позиции, где встретился единичный бит. Диапазон значений зависит от разрядности второго операнда: для 16-разрядного операнда — это 0...15; для 32-разрядного — это 0...31;
  • если единичных битов нет, то флаг zf устанавливается в 1.

Состояние флагов после выполнения команды:

06
ZF
r

Применение:

Команду bsf используют при работе на битном уровне для определения позиции в операнде крайних справа единичных битов.

Например, сдвинем содержимое регистра bx вправо таким образом, чтобы нулевой бит стал единичным:

.386 mov bx,0002h ;bx=0000 0010b... bsf cx,bx ;cx=0001h jz null shr bx,cl ;bx=0000 0001b...null:

См. также: урок 9, 12 и команду bsr

BSR

(Bit Scan Reverse)

Побитное сканирование назад

 

Схема команды: bsr результат,источник

Назначение: проверка наличия единичных битов в операнде источник.

Синтаксис

Алгоритм работы:

  • просмотр битов операнда источник, начиная со старшего бита 15/31 и заканчивая битом 0, до тех пор, пока не встретится единичный бит;
  • если встретился единичный бит, флаг zf устанавливается в 0 и в регистр первого операнда записывается номер позиции (отсчет осуществляется относительно нулевой позиции), где встретился самый старший единичный бит. Диапазон значений зависит от разрядности второго операнда: для 16-разрядного операнда это 0...15; для 32-разрядного — 0...31;
  • если единичных битов нет, флаг zf устанавливается в 1.

Состояние флагов после выполнения команды:

06
ZF
r

Применение:

Команду bsr используют при работе на битном уровне для определения позиции крайних слева единичных битов.

Например, сдвинем содержимое регистра bx вправо таким образом, чтобы старший единичный бит исходного значения в bx переместился в нулевую позицию:

.386 mov bx,41h... bsr cx,bx ;cx=06h jz null shr bx,ax ;bx=0001h...null:...

См. также: уроки 9, 12 и команду bsf

BSWAP

(Byte SWAP)

Перестановка байтов

 

Схема команды: bswap источник

Назначение:

  • изменение порядка следования байтов;
  • переход от одной формы адресации к другой.

Под формой адресации здесь понимается принцип "младший байт по младшему адресу" или обратный ему. Существует ряд систем, например использующих микропроцессоры Motorola или большие ЭВМ, где применяется принцип размещения многобайтовых значений обратный тому, который используется в микропроцессорах Intel. Поэтому эту команду можно использовать для разработки программ-конверторов между подобными платформами и IBM РС.

Синтаксис

Алгоритм работы: Схема алгоритма

Состояние флагов после выполнения команды:

выполнение команды не влияет на флаги

Применение:

Команду bswap используют для изменения формы адресации. В качестве операнда может быть указан только 32-разрядный регистр. Эта команда используется в моделях микропроцессоров, начиная с i486.

.486 mov ebx,1a2c345fhh bswap ebx ;ebx=5f342c1ah

См. также: урок 7, и команду xchg

BT

(Bit Test)

Проверка битов

 

Схема команды: bt источник,индекс

Назначение: извлечение значения заданного бита в флаг cf.

Синтаксис

Алгоритм работы:

  • получить бит по указанному номеру позиции в операнде источник;
  • установить флаг cf согласно значению этого бита.

Состояние флагов после выполнения команды:

00
CF
r

Применение:

Команду bt используют для определения значения конкретного бита в операнде источник. Номер проверяемого бита задается содержимым второго операнда (значение числом из диапазона 0...31). После выполнения команды, флаг cf устанавливается в соответствии со значением проверяемого бита.

.386 mov ebx,01001100h bt ebx,8 ;проверка состояния бита 8 и установка cf= в 1 jc m1 ;перейти на m1, если проверяемый бит равен 1...

См. также: уроки 9, 12 и команды btc, btr, bts, test

BTC

(Bit Test and Complement)

Проверка бита с инверсией (дополнением)

 

Схема команды: btc источник,индекс

Назначение: извлечение значения заданного бита в флаг cf и изменение его значения в операнде на обратное.

Синтаксис

Алгоритм работы:

  • получить значение бита с номером позиции индекс в операнде источник;
  • инвертировать значение выбранного бита в операнде источник;
  • установить флаг сf исходным значением бита.

Состояние флагов после выполнения команды:

00
CF
r

Применение:

Команда btс используется для определения и инвертирования значения конкретного бита в операнде источник. Номер проверяемого бита задается содержимым второго операнда индекс (значение из диапазона 0...31). После выполнения команды флаг cf устанавливается в соответствии с исходным значением бита, то есть тем, которое было до выполнения команды.

.386 mov ebx,01001100h;проверка состояния бита 8 и его обращение: btc ebx,8 ;cf=1 и ebx=01001000h

См. также: уроки 9, 12 и команды bt, btr, bts, test

BTR

(Bit Test and Reset)

Проверка бита с его сбросом в 0

 

Схема команды: btr источник,индекс

Назначение: извлечение значения заданного бита в флаг cf и изменение его значения на нулевое.

Синтаксис

Алгоритм работы:

  • получить значение бита с указанным номером позиции в операнде источник;
  • установить флаг cf значением выбранного бита;
  • установить значение исходного бита в операнде в 0.

Состояние флагов после выполнения команды:

00
CF
r

Применение:

Команда btr используется для определения значения конкретного бита в операнде источник и его сброса в 0. Номер проверяемого бита задается содержимым второго операнда индекс (значение из диапазона 0...31). В результате выполнения команды флаг cf устанавливается в соответствии со значением исходного бита, то есть тем, что было до выполнения операции.

.386 mov ebx,01001100h;проверка состояния бита 8 и его сброс в 0 btr ebx,8 ;cf=1 и ebx=01001000h

См. также: уроки 9, 12 и команды bt, btc, bts, test

BTS

(Bit Test and Set)

Проверка бита с его установкой в 1

 

Схема команды: bts источник,индекс

Назначение: извлечение значения заданного бита операнда в флаг cf и установка этого бита в единицу.

Синтаксис

Алгоритм работы:

  • получить значение бита с указанным номером позиции в операнде источник;
  • установить флаг cf значением выбранного бита;
  • установить значение исходного бита в операнде источник в 1.

Состояние флагов после выполнения команды:

00
CF
r

Применение:

Команда bts используется для определения значения конкретного бита в операнде источник и установки проверяемого бита в 1. Номер проверяемого бита задается содержимым второго операнда индекс (значение из диапазона 0...31). После выполнения команды флаг cf устанавливается в соответствии со значением исходного бита, то есть тем, что было до выполнения операции.

.386 mov ebx,01001100h;проверка состояния бита 0 и его установка в 1 bts ebx,0 ;cf=0 ebx=01001001h

См. также: уроки 9, 12 и команды bt, btc, btr, test

CALL

(CALL)

Вызов процедуры или задачи

 

Схема команды: call цель

Назначение:

  • передача управления близкой или дальней процедуре с запоминанием в стеке адреса точки возврата;
  • переключение задач.

Синтаксис

Алгоритм работы:

определяется типом операнда:

  • метка ближняя — в стек заносится содержимое указателя команд eip/ip и в этот же регистр загружается новое значение адреса, соответствующее метке;
  • метка дальняя — в стек заносится содержимое указателя команд eip/ip и cs. Затем в эти же регистры загружаются новые значения адресов, соответствующие дальней метке;
  • r16, 32 или m16, 32 — определяют регистр или ячейку памяти, содержащие смещения в текущем сегменте команд, куда передается управление. При передаче управления в стек заносится содержимое указателя команд eip/ip;
  • указатель на память — определяет ячейку памяти, содержащую 4 или 6-байтный указатель на вызываемую процедуру. Структура такого указателя 2+2 или 2+4 байта. Интерпретация такого указателя зависит от режима работы микропроцессора:
  • в реальном режиме — в зависимости от размера адреса (use16 или use32) первые два байта трактуются как сегментный адрес, вторые два/четыре байта, как смещение целевой метки передачи управления. В стеке запоминается содержимое регистров cs и eip/ip;
  • в защищенном режиме — интерпретация цели передачи управления зависит от значения байта AR дескриптора, определяемого селекторной частью указателя. Целью здесь являются дальний вызов процедуры без изменения уровня привилегий, дальний вызов процедуры с изменением уровня привилегий или переключение задачи.

Состояние флагов после выполнения команды (кроме переключения задачи):

выполнение команды не влияет на флаги

При переключении задачи значения флажков изменяются в соответствии с информацией о регистре eflags в сегменте состояния TSS задачи, на которую производится переключение.

Применение:

Как видно из описания алгоритма, команда call позволяет организовать гибкую и многовариантную передачу управления на подпрограмму с сохранением адреса точки возврата. Подробно типовые примеры использования рассмотрены на уроках 10 и 14.

См. также: уроки 10, 14 и команду ret

CBW/CWDE

(Convert Byte to Word/Convert Word to Double Word Extended)

Преобразование байта в слово/слова в двойное слово

 

Схема команды: cbw cwde

Назначение: расширение операнда со знаком.

Синтаксис

Алгоритм работы:

cbw — при работе команда использует только регистры al и ax:

  • анализ знакового бита регистра al:
    • если знаковый бит al=0, то ah=00h;
    • если знаковый бит al=1, то ah=0ffh.

cwde — при работе команда использует только регистры ax и eax:

  • анализ знакового бита регистра ax:
    • если знаковый бит ax=0, то установить старшее слово eax=0000h;
    • если знаковый бит ax=1, то установить старшее слово eax=0ffffh.

Состояние флагов после выполнения команды:


Дата добавления: 2019-09-13; просмотров: 277; Мы поможем в написании вашей работы!

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






Мы поможем в написании ваших работ!