Главная Случайная страница


Полезное:

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


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Команды сдвигов и их использования





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

К командам линейного сдвига относятся команды, осуществляющие сдвиг по следующему алгоритму.
1. Очередной «выдвигаемый» бит устанавливает флаг CF.
2. Бит, появляющийся с другого конца операнда, имеет значение 0.
3. При сдвиге очередного бита он переходит во флаг CF, при этом значение предыдущего сдвинутого бита теряется.

shl операнд,счетчик_сдвигов — логический сдвиг влево (Shift Logical Left). Содержимое операнда сдвигается влево на количество битов, определяемое значением счетчик_сдвигов. Справа в позицию младшего бита вписываются нули.

shr операнд,счетчик_сдвигов — логический сдвиг вправо (Shift Logical Right).
Содержимое операнда сдвигается вправо на количество битов, определяемое значением счетчик_сдвигов. Слева в позицию старшего (знакового) бита вписываются нули.

sal операнд,счетчик_сдвигов — арифметический сдвиг влево (Shift Arithmetic Left).
Содержимое операнда сдвигается влево на количество битов, определяемое значением счетчик_сдвигов. Справа (в позицию младшего бита) вписываются нули. Команда SAL не сохраняет знака, но устанавливает флаг OF в случае смены знака очередным выдвигаемым битом. В остальном команда SAL полностью аналогична команде SHL;

sar операнд,счетчик_сдвигов — арифметический сдвиг вправо (Shift Arithmetic Right). Содержимое операнда сдвигается вправо на количество битов, определяемое значением счетчик_сдвигов. Слева в операнд вписываются нули. Команда SAR сохраняет знак, восстанавливая его после сдвига каждого очередного бита.

К командам циклического сдвига относятся команды, сохраняющие значения сдвигаемых битов.

rol операнд,счетчик_сдвигов — циклический сдвиг влево (Rotate Left). Содержимое операнда сдвигается влево на количество битов, определяемое операндом счетчик_сдвигов. Сдвигаемые влево биты записываются в тот же операнд справа.
ror операнд,счетчик_сдвитов — циклический сдвиг вправо (Rotate Right). Содержимое операнда сдвигается вправо на количество битов, определяемое операндом счетчик_сдвигов. Сдвигаемые вправо биты записываются в тот же операнд слева.

rcl операнд,счетчик_сдвигов — циклический сдвиг влево через перенос (Rotate through Carry Left). Содержимое операнда сдвигается влево на количество битов, определяемое операндом счетчик_сдвигов. Сдвигаемые биты поочередно становятся значением флага переноса CF;
rcr операнд,счетчик_сдвигов — циклический сдвиг вправо через перенос (Rotate through Carry Right). Содержимое операнда сдвигается вправо на количество битов, определяемое операндом счетчик_сдвигов. Сдвигаемые биты поочередно становятся значением флага переноса CF.

 

9. Команды умножения и деления чисел с ФТ.

Умножение чисел без знака

Для умножения чисел без знака предназначена команда MUL. У этой команды только один операнд — второй множитель, который должен находиться в регистре или в памяти. Местоположение первого множителя и результата задаётся неявно и зависит от размера операнда:

Отличие умножения от сложения и вычитания в том, что разрядность результата получается в 2 раза больше, чем разрядность сомножителей. Также и в десятичной системе — например, умножая двухзначное число на двухзначное, мы можем получить в результате максимум четырёхзначное. Запись «DX:AX» означает, что старшее слово результата будет находиться в DX, а младшее — в AX. Примеры:

 

mul bl;AX = AL * BL mul ax;DX:AX = AX * AX

Если старшая часть результата равна нулю, то флаги CF и ОF будут иметь нулевое значение. В этом случае старшую часть результата можно отбросить. Это свойство можно использовать в программе, если результат должен быть такого же размера, как множители.

Умножение чисел со знаком

Для умножения чисел со знаком предназначена команда IMUL. Эта команда имеет три формы, различающиеся количеством операндов:

С одним операндом — форма, аналогичная команде MUL. В качестве операнда указывается множитель. Местоположение другого множителя и результата определяется по таблице.

С двумя операндами — указываются два множителя. Результат записывается на место первого множителя. Старшая часть результата в этом случае игнорируется. Кстати, эта форма команды не работает с операндами размером 1 байт.

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

Примеры:

imul cl;AX = AL * CL imul si;DX:AX = AX * SI imul bx,ax;BX = BX * AX imul cx,-5;CX = CX * (-5) imul dx,bx,134h;DX = BX * 134h

Деление чисел без знака

Деление целых двоичных чисел — это всегда деление с остатком! По аналогии с умножением, размер делителя, частного и остатка должен быть в 2 раза меньше размера делимого. Деление чисел без знака осуществляется с помощью команды DIV. У этой команды один операнд — делитель, который должен находиться в регистре или в памяти. Местоположение делимого, частного и остатка задаётся неявно и зависит от размера операнда:

При выполнении команды DIV может возникнуть прерывание (о прерываниях я подробно расскажу потом, пока старайтесь избегать таких случаев):

если делитель равен нулю;

если частное не помещается в отведённую под него разрядную сетку (например, если при делении слова на байт частное больше 255).

Примеры:

div cl;AL = AX / CL, остаток в AH div di;AX = DX:AX / DI, остаток в DX

Деление чисел со знаком

Для деления чисел со знаком предназначена команда IDIV. Единственным операндом является делитель. Местоположение делимого и частного определяется также, как для команды DIV. Эта команда тоже генерирует прерывание при делении на ноль или слишком большом частном.

 

10 Логические команды обработки битов.

Команды побитовой обработки:

  • Позволяют анализировать или изменить часть операнда
  • Выполняются быстрее
  • Имеют 1-3 операнда
  • Операндом может быть: имя регистра, адрес ячейки оперативной памяти, непосредственный операнд
  • Операнды имеют размер: байт, слово, двойное слово
  • По назначению делятся на: логические, доступа к отдельным битам и команды сдвига

Логические операции
Все команды, кроме NOT, изменяют флаги zf, cf, of, pf, sf
AND — Побитовое логическое умножение. Используют для выделения части битов.
1100 AND 1010 = 1000

OR — Побитовое логическое сложение. Используют вместо команд сравнения
1100 OR 1010 = 1110
or ax, ax => cmp ax, 0

XOR — Побитовое сложение по модулю два. Используют для обнуления.
1100 XOR 1010 = 0110
1010 XOR 1010 = 0000

TEST — Выполняется логическое умножение, но приемник не меняется. Меняются только флаги.

NOT — Инвертирует каждый бит
NOT 1010 = 0101

 

11. Макросы: использование параметров и комментарии

Примеры макросов

В качестве примера рассмотрим простой макрос без параметров, который предназначен для завершения программы:

macro exit_app { mov ax,4C00h int 21h }

После того, как макрос объявлен, в нужном месте программы достаточно написать exit_app. Туда препроцессор FASM автоматически подставит 2 команды, записанные в теле макроса. Создадим ещё один полезный макрос, предназначенный для такой часто используемой операции, как вывод строки:

macro print_str str { mov ah,9 mov dx,str int 21h }

У этого макроса есть один параметр — адрес строки. При генерации кода вместо str будет подставлен тот параметр, который указан при вызове макроса. Обратите внимание, что код будет генерироваться в месте каждого вызова макроса! В этом главное отличие макроса от процедуры. Код процедуры содержится в программе только в одном экземпляре, а вызывается она с помощью передачи управления командойCALL.

Теперь добавим эти макросы в программу «hello, world!» из части 6 учебного курса:

  ; Макрос выхода из программы macro exit_app { mov ax,4C00h ;Здесь только объявление макроса, код не генерируется int 21h }   ; Макрос вывода строки macro print_str str { mov ah,9 ;Здесь тоже код не генерируется mov dx,str int 21h }   ;------------------------------------------------------------------------------- use16 ;Генерировать 16-битный код org 100h ;Программа начинается с адреса 100h   print_str hello ;Вывод строки exit_app ;Выход из программы   ;------------------------------------------------------------------------------- hello db 'Hello, macro world!$'

В результате основная программа состоит всего из двух строчек, и это уже не похоже на ассемблер, это — макроассемблер FASM

Date: 2016-05-24; view: 768; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.005 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию