Главная страница
Навигация по странице:

  • Логический и арифметический сдвиг влево

  • Линейный сдвиг. Лабораторная работа 14 Линейный сдвиг


    Скачать 142.44 Kb.
    НазваниеЛабораторная работа 14 Линейный сдвиг
    АнкорЛинейный сдвиг
    Дата28.02.2023
    Размер142.44 Kb.
    Формат файлаdocx
    Имя файла14.docx
    ТипЛабораторная работа
    #959309

    Лабораторная работа №14

    Линейный сдвиг
    Сдвиги — это особые операции процессора, которые позволяют реализовать различные преобразования данных, работать с отдельными битами, а также быстро выполнять умножение и деление чисел на степень 2.
    Логический сдвиг вправо

    Логический сдвиг всегда выполняется без учёта знакового бита. Для логического сдвига вправо предназначена команда SHR. У этой команды два операнда. Первый операнд представляет собой сдвигаемое значение и на его место записывается результат операции. Второй операнд указывает, на сколько бит нужно осуществить сдвиг. Этим операндом может быть либо непосредственное значение, либо регистр CL. Схема выполнения операции показана на рисунке:



    Все биты операнда сдвигаются вправо (от старших битов к младшим). Выдвинутый бит становится значением флага CF. Старший бит получает нулевое значение. Эта операция повторяется несколько раз, если второй операнд больше единицы. Логический сдвиг вправо можно использовать для деления целых чисел без знака на степень 2, причём сдвиг работает быстрее, чем команда деления DIV. Примеры:

    shr ax,1 ;Логический сдвиг AX на 1 бит вправо

    shr byte[bx],cl ;Лог. сдвиг байта по адресу BX на СL бит вправо

    shr cl,4 ;CL = CL / 16 (для числа без знака)


    Арифметический сдвиг вправо

    Арифметический сдвиг отличается от логического тем, что он не изменяет значение старшего бита, и предназначен для чисел со знаком. Арифметический сдвиг вправо выполняется командой SAR. У этой команды тоже 2 операнда, аналогично команде SHR. Схема выполнения операции показана на рисунке:



    Выдвинутый бит становится значением флага CF. Знаковый бит не изменяется. При сдвиге на 1 бит сбрасывается флаг OF. Эту команду можно использовать для деления целых чисел со знаком на степень 2 (обратите внимание, что «округление» всегда в сторону меньшего числа, поэтому для отрицательных чисел результат будет отличаться от результата деления с помощью команды IDIV). Примеры:

    sar bx,1 ;Арифметический сдвиг BX на 1 бит вправо

    sar di,cl ;Арифметический сдвиг DI на CL бит вправо

    sar [x],3 ;x = x / 8 (x - 8-битное значение со знаком)


    Логический и арифметический сдвиг влево

    Логический сдвиг влево выполняется командой SHL, а арифметический — командой SAL. Однако, на самом деле это просто синонимы для одной и той же машинной команды. Сдвиг влево одинаков для чисел со знаком и чисел без знака. У команды 2 операнда, аналогично командам SHR и SAR.Схема этой операции показана на рисунке:



    Старший бит становится значением флага CF, а младший получает нулевое значение. С помощью сдвига влево можно быстро умножать числа на степень 2. Но будьте внимательны, чтобы не получить в результате переполнение. Если при сдвиге на 1 бит меняется значение старшего бита, то устанавливается флаг OF. Примеры использования команды:

    shl dx,1 ;Сдвиг DX на 1 бит влево

    sal dx,1 ;То же самое

    shl ax,cl ;Сдвиг AX на CL бит влево

    sal [x],2 ;x = x * 4


    Сдвиги двойной точности

    Существуют ещё две команды, осуществляющие более сложные сдвиги. SHRD — сдвиг двойной точности вправо, SHLD — сдвиг двойной точности влево. У этих команд 3 операнда. Первый операнд — сдвигаемое значение и место для записи результата, должен иметь размер 16 бит. Второй операнд — источник вдвигаемых битов, тоже должен иметь размер 16 бит и находится в одном из регистров. Значение второго операнда не меняется. Третий операнд — счётчик сдвигов, может быть непосредственным значением или находиться в регистре CL. Схемы работы этих команд показаны на рисунке:



    Небольшой пример использования команды SHLD:

    shld ax,bx,3 ;Сдвинуть ax на 3 бита влево,

    ;3 старших бита BX становятся младшими битами AX



    Пример программы

    Программа печатает переменную размером 16-бит в двоичном виде. Используется команда сдвига влево на 1 бит, после чего анализируется значение флага CF. Если CF=0, выводим символ ‘0’, если СF=1 выводим символ ‘1’. Проверка битов осуществляется в цикле.

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    use16 ;Генерировать 16-битный код

    org 100h ;Программа начинается с адреса 100h

    jmp start ;Безусловный переход на метку start

    ;-- Данные ------------------------------------------------------------

    v dw 12345

    pak db 13,10,'Press any key...$'

    ;----------------------------------------------------------------------

    start:

    mov bx,[v] ;BX = v

    mov ah,2 ;Функция DOS 02h - вывод символа

    mov cx,16 ;Инициализация счётчика цикла

    lp:

    shl bx,1 ;Сдвиг BX на 1 бит влево

    mov dl,'0' ;dl = '0'

    jnc print ;Переход, если выдвинутый бит равен 0

    inc dl ;dl = dl + 1 = '1'

    print:

    int 21h ;Обращение к функции DOS 02h

    loop lp ;Команда цикла

     

    mov ah,9 ;\

    mov dx,pak ; > Выводстроки 'Press any key...'

    int 21h ;/

     

    mov ah,8 ;\

    int 21h ;/ Вводсимволабезэха

     

    mov ax,4C00h ;\

    int 21h ;/ Завершение программы

    Результат работы программы:


    Задание

    Объявите массив из 8 слов без знака. Сдвиньте первый элемент на 1 бит влево, второй элемент — на 2 бита вправо (логическим сдвигом), третий элемент — на 3 бита влево и т.д. до конца массива. Используйте циклы. Проверьте работу программы в отладчике.


    написать администратору сайта