Команды побитовой обработки (2ч) — КиберПедия 

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

Команды побитовой обработки (2ч)

2022-10-04 32
Команды побитовой обработки (2ч) 0.00 из 5.00 0 оценок
Заказать работу

 

Команды делятся на 2 группы:

а) Логические команды.

Общие черты:

1) выполняют побитовую обработку операндов параллельно без переносов

      1-истина

      0-ложь;

2) модифицируют флаги, но важен только флаг ZF;

3) операндамимогут быть байты или слова в регистрах или ячейках памяти, второй операнд может быть непосредственным.

 

       NOTop; отрицание op(инверсия кода); Флаги не модифицирует.

ANDop1, op2; op1:=op1^ op2

OR op1, op2; op1:= op1v op2 

XORop1, op2; op1:= op1Åop2

TESTop1,op2; op1^ op2 – результат не запоминается. Эта операция называется «логическое сравнение». Цель формирование флага ZF, который ZF = 1 - если результат нулевой, иначе ZF = 0.

Как правило, второй операнд трактуется как маска, хранящая единицы в разрядах op1, которые нас интересуют.

 

б) Команды сдвигов

Все команды сдвигов имеют 2 операнда:

оp1 – рассматривается, как набор битов, подлежащих сдвигу влево или вправо;

       op2 – константа сдвига, т.е. целоечисло без знака, определяет, на сколько разрядов нужно сдвигать первый операнд.

Результат записывается на место первого операнда.

Каждая команда может иметь 2 разновидности:

МНК op, 1; сдвиг на 1 разряд

МНК op, CL; константа сдвига хранится в CL

Само значение CLне изменяется.

Команды сдвига модифицируют флаги, кроме AF, а “уходящий” бит фиксируется в CF.

Команды сдвига делятся на арифметические, логические и циклические.

А) Логическийсдвиг – можно трактовать как умножение беззнаковых чисел на 2CL.

op  
CF  
       SHLop,1;сдвиг влево

       SHLop, CL;сдвиг влево                                                       0

 

 

       SHRop,1;сдвиг вправо

CF  
op  
       SHRop, CL;сдвиг вправо   0        

Б)Арифметический сдвиг  – предназначендля быстрого умножениячисел со знаком на 2CL

       SALop,1; сдвигарифм. влево

       SALop,CL;  сдвигарифм. влево                                                      0

 


CF
op
SARop,1;сдвигарифм.вправо

SARop,1;сдвигарифм.вправо    0

CF
op
В)Циклический сдвиг – отличается тем, что «удящий» бит возвращается в операнд и одновременно фиксируется в CF.

       ROLop,1;сдвиг циклич. влево

ROLop,CL;сдвиг циклич. влево

           

 


RORop,1;сдвигциклич. вправо

RORop,CL; сдвигциклич. вправо

 

 

op  
CF  
RCL ор,1; сдвиг циклич. через  переносвлево

RCL ор,CL; сдвиг циклич. через переносвлево

 

 


RCRop,1;сдвиг циклич. через перенос вправо

RCRop,CL;сдвиг циклич. через перенос вправо

Циклические сдвиги позволяют образовать передачу числа с последовательным кодом и анализировать разряды числа.

В МП 80286 и позже допускается использование второго операнда без загрузки в CL (непосредственный).

Например,

SHLAX,3


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

 

Метки, данные, переходы

 

Условные и безусловные переходы являются важнейшей частью любой программы; они позволяют писать программы с ветвящимися и циклическими алгоритмами.

Данные в программах на ассемблере объявляются (или резервируются) с помощью директив данных. В табл. приведены директивы для объявления данных (переменных).

За директивой описания данных должно следовать одно или несколько числовых значений, разделенных запятыми. Эти выражения определяют значения для простейших элементов данных, размер которых зависит от того, какая директива используется. Вместо числового значения может стоять символ; впоследствии он будет интерпретирован как числовой код символа (символов).

 

 

Пример использования директив объявления данных

db 67h

db 5dh, 0f6h

db "z"     ; то же самое, что и db 7ah

db "w", "k", "y"

dw 8a34h, 0c51h, 8bh

du 9e3ah, 07deh

dw "WE"; то же самое, что и db 57h, 45h

dd 01F243D5Eh

dd "WEGa"; то же самое, что и db 57h, 45h, 47h, 61h

dq 1122334455667788h

 

За директивами db и du могут следовать строки неопределённого размера; в результате каждый символ будет интерпретирован как его числовое значение. Отличие директивы du от db заключается в том, что каждый символ интерпретируется двумя байтами, старший из которых заполняется нулём, например:

db "assembler"

то же самое, что и

db 61h, 73h, 73h, 65h, 6Dh, 62h, 6Ch, 65h, 72h

du "assembler"

то же самое, что и

db 0, 61h, 0, 73h, 0, 73h, 0, 65h, 0, 6Dh, 0, 62h, 0, 6Ch, 0, 65h, 0, 72h

Для описания большей последовательности одинаковых данных предназначена директива dup. Она используется после директивы определения данных. Перед ней должно стоять число повторений, а после неё (в скобках) - значение или цепь значений для повторения.

db 7 dup (1Ah)

db 6 dup (45h, 0A3h, 90h)

dd 13 dup (0A713E445h)

dd 9 dup (0A713E445h, 0F8D3E412h)

dw 5       dup (?)

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

 

Метки

 

Метка - идентификатор, который используется в программе и возвращает адрес памяти, по которому она находится. Метка - это главная форма взаимодействия с данными в памяти. Если метка используется в программе, то фактически на месте метки будет стоять адрес, на который она указывает.

Существуют разные способы определения меток. Простейший из них - двоеточие после названия метки. За этой директивой на той же строке может следовать инструкция или директива. Она определяет метку, значение которой равно смещению, т. е. адресу точки, в которой она определена. Вернее, смещению следующей директивы или инструкции. Этот метод обычно используется, чтобы пометить места в коде, но ничто не мешает вам пометить этим методом данные.

Данные обычно помечаются другим методом - это написание названия метки перед директивой объявления данных. Метка возвращает адрес данных, перед которыми она объявлена. Компилятор запоминает размер данных, на которые указывает эта метка, и при использовании с ней операндов, несовместимых по размеру, уведомляет об этом. При использовании этого метода объявления меток отпадает необходимость использования операторов размера (word, dword, qword и т. д.).

Третий метод объявления меток - самый гибкий: это использование директивы label. После этой директивы должно следовать имя метки, потом (опционально) размер оператора, далее (тоже опционально) оператор “at” и числовое выражение, определяющее адрес, на который данная метка должна ссылаться. В качестве адреса может использоваться другая метка, ведь метка это то же самое что и адрес, на который она указывает. Примеры объявления меток приведены в листинге.

 

Примеры объявления меток

metka1:   dd...

data1       db...

dw...

mov...

add...

metka2:

and...

xor...

label metka3 dword at metka2

    rcl...

В реальных программах выражение типа

moveax, dword[ 0 0 0 0 5 0 9 Ah ]

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

 

Примеры использования меток

metka1:   dd...

data1                   db...

                dw...

    …

    mov al, [data1]

metka2:

    mov ebx, eax

    mov ebx, dword [metka1]

    mov [data1], 4567AADDh

    mov сx, word [metka2]

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

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

 

Примеры использования локальных и глобальных меток

 

globmetka1:

.locmetka1 dd...

.Iocmetka2:

mov[.locmetka1], eax

movword[.Iocmetka2], сx

movword[.Iocmetka3], сх; ошибка!

mov word [globmetka2.Iocmetka2], сx

globmetka2:

.Iocmetka3:...

mov [..globmetka3.Iocmetka4], сx; ошибка!

mov [globmetka3.Iocmetka4], сx;ошибка!..

..globmetka3:

. Iocmetka4: dw...

mov [.Iocmetka4], сx

 

Метка $ обозначает текущее смещение или смещение текущей команды; таким образом, чтобы бесконечно зациклить выполнение программы, достаточно написать в программе jmp $, т. е. это будет ее безусловный «прыжок на саму себя».

Метки бывают ближние и дальние. Дальность или близость метки определяется только тем, в каком месте она используется. Одна и та же метка, используемая в двух разных командах, в одной команде может быть ближней, а в другой - дальней. Ближняя метка -та, которая определена не далее чем 127 байт после и не далее чем на 128 байт до команды, где она используется. Все метки, которые находятся за этими пределами, являются дальними. Дальность или близость меток имеет значение только с командами передачи управления.

Также при объявлении данных может быть необходимо объявлять разные структуры данных, в то же время находящиеся по одному адресу. Это может пригодиться, когда одни и те же данные в зависимости от контекста могут интерпретироваться по-разному, и удобнее было бы использовать разные названия переменных. В таких случаях применяется директива virtual. Далее в листинге приведён пример её использования.

 

ИспользованиедирективыVIRTUAL

paramdd?

virtual at param

LowPartdw?

HighPartdw?

end virtual

virtual at param

Byte1 db?

Byte2 db?

Byte3 db?

Byte4 db?

endvirtual

 

В примере, описанном в листинге, обратившись к переменной LowPart мы получим младшую часть переменной param, а обратившись к переменной Byte3 получим третий байт переменной param, или первый байт переменной HighPart.

Также с помощью данной директивы можно задавать данные, находящиеся по адресу, который адресует какой-нибудь регистр общего назначения, например:

 

Тогда инструкция

movbl, [Char1] - то же самое, что и

movbl, [еах], а инструкция

movbl, [Char3 ] - то же самое, что и

movbl, [ еах+2 ]. Но более удобным и понятным был бы вариант использования этой директивы, приведённый в следующем листинге

 


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

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

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

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

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



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

0.05 с.