Добавил:
vanya.tagaschev@ya.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
4
Добавлен:
21.03.2021
Размер:
609.49 Кб
Скачать

МИНИСТЕРСТВО ВЫСШЕГО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

федеральное государственное бюджетное образовательное учреждение высшего образования

УЛЬЯНОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Факультет информационных систем и технологий Кафедра «Измерительно-вычислительные комплексы»

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

По дисциплине «Организация ЭВМ и систем»

Тема: «Операции сдвига данных. Обработка данных в форматах ASCII и BCD. Команды передачи управления»

Выполнил: ст. гр. ИСТбд-22 Тагашев И.И.

Проверил: к.т.н., доцент ИВК Тамьяров А.В.

Ульяновск, 2021 г.

ЛАБОРАТОРНАЯ РАБОТА № 4

Тема: «Операции сдвига данных. Обработка данных в форматах ASCII и BCD. Команды передачи управления»

Цель работы: Освоение принципов работы с битовой информацией и форматом представления данных. Приобретение навыков организации подпрограмм и безусловных переходов.

Ход работы:

1.Сдвиги и циклические сдвиги

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

Инструкция SHL (сдвиг влево, синоним - SAL) перемещает каждый бит операнда-приемника на один разряд влево, по направлению к самому значащему биту. На Рис. 1 показано, как значение 10010110b (96h или 150 в десятичном представлении), записанное в AL, сдвигается влево с помощью инструкции SHL AL,1. В результате получается значение 00101100b (2Ch или 44 в десятичном виде), которое записывается обратно в регистр AL. Флаг переноса устанавливается в значение 1.

AL

Происходит смещение всех битов влево по следующей схеме.

10010110

В этой операции участвует флаг переноса.

Рис. 1 Пример выполнения сдвига влево.

Самый значащий (старший) бит вовсе сдвигается из операнда и попадает во флаг переноса, а в наименее значащий бит заносится 0.

Для чего используется сдвиг влево? Чаще всего это делается для выполнения с помощью операции SHL умножения на степень числа 2, так как каждая инструкция SBL умножает операнд на 2. Например, с помощью следующих инструкций DX умножается на 16:

shl dx,1 ; DX * 2

shl dx,1 ; DX * 4

shl dx,1 ; DX * 8

shl dx,1 ; DX * 16

Умножение с помощью сдвига выполняется гораздо быстрее, чем с помощью операции MUL.

Как можно было заметить, в предыдущем примере в инструкции SHL используется второй операнд - значение 1. Этот операнд указывает, что содержимое DX нужно сдвинуть на 1 бит. К сожалению, процессор не поддерживает использования в качестве константы

сдвига других, отличных от 1 постоянных значений - 2, 3 и т.д. Однако, в качестве счетчика сдвигов допускается использование регистра CL. Например, инструкции:

mov cl, 4

shl dx,cl

умножают содержимое регистра DX на 16 (как и в предыдущем примере),

Если есть сдвиг влево, то логично было бы предположить, что существует также сдвиг вправо, и это так. Фактически, имеется даже две операции сдвига вправо. Инструкция SHR (сдвиг вправо) очень похожа на инструкцию SHL. Она выполняет сдвиг разрядов операнда вправо на 1 или CL бит, затем сдвигает наименее значащий бит во флаг переноса и помещает 0 в самый значащий бит. Инструкция SHR дает быстрый способ выполнения беззнакового деления на степень числа 2.

Инструкция SAR (арифметический сдвиг вправо) аналогична инструкции SHR, только при ее выполнении наиболее значащий бит операнда сдвигается вправо в следующий бит, а затем копируется обратно. На Рис. 2 показано, как значение 10010110b (96h или -106 в десятичном представлении со знаком), записанное в регистре AL, сдвигается вправо с помощью инструкции SAR AL,1. В результате получается значение 11001011b (CBh или - 53 в десятичном представлении со знаком), которое записывается обратно в регистр AL. Флаг переноса устанавливается в значение 0.

AL

10010110

В этой операции участвует флаг переноса.

Рис. 2 Пример выполнения инструкции SAR (арифметический сдвиг вправо)

Таким образом, при выполнении данной инструкции сохраняется знак операнда, поэтому инструкцию SAR полезно использовать для выполнения деления со знаком на степень числа 2. Например, в результате выполнения инструкций:

mov bx,- 4

sar bx,l

в регистре ВХ после выполнения команд получится значение - 2.

В наборе инструкций процессора имеется также четыре инструкции циклического сдвига: ROR, ROL, RCR и RCL. Инструкция ROR аналогична инструкции SHR, но при ее выполнении наименее значащий бит сдвигается в наиболее значащий бит, а также во флаг переноса. На Рис. 3 показано, как значение 10010110b (96h или 150 в десятичном представлении), записанное в регистре AL, циклически сдвигается вправо с помощью инструкции ROR AL,1. В результате получается значение 01001011b (4Bh или 75 в десятичном представлении), которое записывается обратно в регистр AL. Флаг переноса устанавливается в значение 0.

AL

10010110

--------------------------------

В этой операции участвует флаг переноса.

Рис. З Пример выполнения операции ROR (циклический сдвиг)

Операция ROL имеет действие, обратное действию операции ROR. Операнд также сдвигается циклически, но сдвиг выполняется влево.

При этом наиболее значащий бит сдвигается в наименее значащий.

Инструкции ROR и ROL полезно использовать для переупорядочивания бит в байте или в слове. Например, в результате выполнения инструкций:

mov si,49Flh

mov cl,4

ror si,cl

в регистр SI будет записано значение 149Fh: биты 3-0 переместятся в биты 15-12, биты 7-4 - в биты 3-0 и т.д.

Инструкции RCR и RCL работают несколько по-другому. Инструкция RCR аналогично инструкции сдвига вправо, при этом наиболее значащий бит сдвигается из флага переноса. На Рис. 4 показано, как значение 10010110b (96h или 150 в десятичном представлении), записанное в регистре AL, циклически сдвигается вправо через флаг переноса, начальное значение, которого равно 1, с помощью инструкции RCR AL,1, в результате получается значение 11001011b (CBh или 203 в десятичном представлении), которое записывается обратно в регистр AL. Флаг переноса устанавливается в значение 0.

AL

10010110

--------------------------------

Флаг переноса

1

Рис. 4 Пример выполнения инструкции RCR (циклический сдвиг вправо и перенос).

Инструкция RCL аналогично, соответственно, левому сдвигу. При выполнении этой инструкции наименее значащий бит сдвигается из флага переноса. Инструкции RCR и RCL полезно использовать для сдвига операнда, состоящего из нескольких слов. Например, следующие инструкции выполняют умножение значения в DX:AX, размером в двойное слово, на 4:

shl ах,1 ; бит 15 регистра АХ сдвигается во флаг переноса

rcl dx,l ; флаг переноса сдвигается в бит 0 регистра DX

shl ax,l ; бит 15 регистра АХ сдвигается во флаг переноса

rcl dx,l

; флаг переноса сдвигается в бит 0 регистра DX.

Инструкции циклического сдвига, аналогично инструкциям сдвига, могут сдвигать операнд на 1 бит или на число бит, заданных регистром CL.

2. ASCII-формат.

Данные, которые вводятся с клавиатуры в компьютер имеют ASCII формат, т.е. каждому символу в соответствие приводится ASCII-код. Например латинский символ А имеет код 41h, символ пробел - 20h и т.д. Например слово SAM в памяти компьютера имеет представление цепочкой из трех байт: 53h, 41h, 4dh. Во многих случаях формат алфавитных данных, например имя человека или описание статьи, не меняется в программе. Но для выполнения арифметических операций над числовыми значениями, такими, как 31h, 32h, 33h, 34h (1234 в ASCSII формате) требюуется специальная обработка.

С помощью специальных команд можно выполнять арифметические операции непосредственно над числами в ASCII-формате. Эти команды кодируются без операндов и выполняют автоматическую коррекцию в регистре АХ. Коррекция необходима, так как ASCII-код представляет так называемый распакованный десятичный формат, в то время как компьютер выполняет арифметические операции в двоичном формате.

Инструкция ААА

Инструкция ААА (коррекция для сложения ASCII-кода) проверяет правую шестнадцатеричную цифру (младшие 4 бита) в регистре AL. Если эта цифра находится между 0Ah и 0Fh или флаг AF равен 1, то к регистру AL прибавляется 6, а к регистру АН прибавляется 1, флаги AF и CF устанавливаются в 1. Во всех случаях команда ААА устанавливает 0 в левую шестнадцатеричную цифру в регистре AL (старшие четыре бита). Результат - в регистре АХ. Для получения окончательного ASCII кода затем просто к АН и к AL прибавляют код нуля - 30h.

Инструкция ААS

Инструкция AAS (коррекция для вычитания ASCII-кода) выполняется аналогично команде ААА. Эта инструкция проверяет правую шестнадцатеричную цифру (четыре младших бита) в регистре AL. Если значение находится в диапазоне значений 0Ah - 0Fh или флаг АF равен 1, то из регистра AL вычитается 6, а из регистра АН вычитается 1, флаги AF и CF устанавливаются в 1. Во всех случаях команда AAS устанавливает в 0 левую шестнадцатеричную цифру в регистре.

Инструкция ААМ

Инструкция ААМ (коррекция для умножения ASCII кодов) выполняет корректировку результата умножения ASCII-кодов в регистре АХ. Однако шестнадцатеричные цифры должны быть очищены от троек в старших четырех битов в АН и AL. Полученные данные уже не будут являться действительными ASCII-кодами. (В руководствах фирмы IBM для таких данных используется термин "распакованный десятичный формат") . Например, число в ASCII-формате 31323334h имеет распакованное десятичное значение 01020304. Кроме того, надо помнить, что коррекция осуществляется только для одного байта заодно выполнение, поэтому можно умножать только однобайтовые поля, для более длинных полей необходима организация цикла. Эта инструкция делит содержимое регистра AL на 10 (0Ah) и записывает частное в регистр АН, а остаток - в AL.

 

Пример использования:

and cl,0Fh

; очистка старших четырех бит в регистре CL

and al,0Fh

; очистка старших четырех бит в регистре AL

mul cl

; AL = AL * CL

amm

; коррекция г

or ax,3030h

; преобразование в ASCII-формат

Инструкция AAD

Инструкция AAD (коррекция для деления ASCII-кодов) выполняет коррекцию ASCII кода делимого до непосредственного деления. Однако, прежде необходимо очистить старшие четыре бита в каждом байте для получения распакованного десятичного формата. Инструкция AAD может оперировать с двухбайтовыми делимыми в регистре АХ. Инструкция умножает содержимое АН на 10 (0Fh), прибавляет результат к регистру AL и очищает регистр АН. Делитель может быть только однобайтовый от 1 до 9.

Пример использования:

and cl,0Fh

and ax,0f0fh

aad

div cl

3. Двоично-десятичный формат (BCD).

Если взять число в распакованном десятичном формате, например 00090204 и сжать это число, сохраняя только правые цифры каждого байта, то получим число 0924h. Такой формат называется двоично-десятичным (BCD - Binary Coded Devimal). Он содержит только десятичные цифры от 0 до 9. Длина двоично-десятичного представления два раза меньше ASCIIпредставления. Заметим, что двоично-десятичное число 0924 имеет основание 10 и, будучи преобразованным в число с основание 16 (т.е. в шестнадцатеричное представление), даст 039Ch. Для обработки чисел в таком формате существуют две команды:

DAA - десятичная коррекция для сложения,

DAS - десятичная коррекция для вычитания.

При выполнении команд DAA и DAS учитывается значение признака переноса между тетрадами (AF). После выполнения команды AF сбрасывается в 0.

Пример использования:

Inc Al

Daa

ЗАДАНИЕ №1

mov count,16; переменная count в которой

;будет количество 0 бит в младшем и старшем байтах строки mov dl,"h";первый байт

mov cx,8 a0: shl dl,1

sbb count,0; если найден 1 бит, тогда из count вычитается 1 loop a0

mov dl,"y";последний байт mov cx,8

a1: shl dl,1 sbb count,0 loop a1

ЗАДАНИЕ №2 model small

include io.asm ; подключение модуля io.asm

.stack 100h

.data

d db 28 m db 3 g db 82

z dw ? ; для результата

.code start: ; точка входа в программу

mov ax,@data ; загрузка адреса сегмента данных

mov ds,ax

mov al,2 ; 2 à al

mul d ; ax := al * d (=2d) mov z,ax ; 2d à z

mov al,g ; g - al mul m ; gm à ax

sub z,ax ; в z - результат вычисления

outint z ; вывод z (если z может быть отрицательно) или outword z ; вывод z (если z неотрицательно) mov ax,4C00h ; завершение работы

int 21h end start

КОМАНДЫ БЕЗУСЛОВНОЙ ПЕРЕДАЧИ УПРАВЛЕНИЯ.

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

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

Близкие и дальние переходы

Команды перехода модифицируют указатель команды IP и, возможно, регистр сегмента кодов CS. Эти регистры показывают, какая следующая команда должна быть выполнена. Команда перехода является специальным случаем пересылки MOV данных в регистр или пару регистров; и некоторые ЭВМ действительно выполняют команду перехода именно таким способом. Однако способы загрузки пары регистров CS:IP в микропроцессоре 8086 во многом отличаются от способов, используемых для других регистров.

Прежде всего мы должны ввести некоторые определения. Если команда перехода изменяет только регистр IP, это близкий переход (NEAR-переход), так как переход происходит внутри сегмента. Если переход изменяет регистр CS, это далекий (FAR-переход). Атрибуты NEAR и FAR используются при работе ассемблера. Любая метка в программе на языке ассемблера имеет атрибут либо NEAR, либо FAR, также, как данные имеют атрибуты BYTE или BGRD. В некоторых примерах этой главы имеются процедуры, которые используют атрибут NEAR в операторе PROC. Это означает, что метка, связанная с оператором PROC (имя процедуры) имеет атрибут NEAR. Ассемблер использует эту информацию для того, чтобы определить, какой тип команды перехода или вызова породить при переходе к этой метке. Поскольку большинство процедур - подпрограммы, атрибут NEAR или FAR оператора SROC также определяет тип порождаемой команды возврата. Вызов FARпроцедуры сохраняет значения как регистра CS, так и регистра IP, тогда как вызов NEAR-процедуры оставляет в стеке только значение регистра IP, Команда возврата должна учитывать, какой тип вызова был сделан, чтобы подпрограмма могла вернуться к правильному месту.

Адресация переходов.

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

Существуют два метода вычисления адреса перехода. Если в команде указано значение адреса, это абсолютный переход, т.е. переход по абсолютному адресу. Команда может указать место перехода, как некоторое расстояние от нее самой. Этот метод перехода называется относительным

переходом.

Преимущество относительных переходов в том, что программа наиболее часто переходит к близлежащим ячейкам; команда перехода может использовать однобайтовое смещение. Если смещение трактуется, как число в дополнительном коде, то двухбайтовая команда относительного перехода (один байт - код операции, и один байт смещение) может выполнить переход на 127 байт вперед или на 128 байт назад внутри программы. Микропроцессор 8086 имеет два типа - относительных переходов: один имеет однобайтовое смещение, другой двухбайтовое.

В микропроцессоре 8086 все условные переходы имеют однобайтовое смещение. Иногда это неудобно, например, в случае условного перехода к ячейке, находящейся на расстоянии в 150 байт от текущего места. В таких случаях программа должна использовать пару переходов, условный и безусловный; далее приводится пример такого метода перехода. В обычных же случаях однобайтовые смещения условных переходов в микропроцессоре 8066 минимизируют объем программы, необходимой для реализации любой заданной функции.

При расчете смещения относительного перехода микропроцессор 8086 отсчитывает смещения от значения указателя команд, которое получится после выполнения команды. Если точка перехода следует непосредственно за переходом, смещение равно 0. При переходе к самой команде перехода смещение равно -2. При двухбайтовом смещении переход может быть сделан в диапазоне -32768 - 32767 байт от значения регистра IP после выполнения команды перехода.

Команды безусловной передачи управления.

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

- команды безусловного перехода:

JMP SHORT - в пределах 128 байт вверх и вниз (только непосредственный операнд),

JMP NEAR - в пределах текущего сегмента (непосредственная и косвенная адресация),

JMP FAR - в любую точку памяти (непосредственная и косвенная адресация).- команды вызова:

CALL NEAR - вызов подпрограммы внутри текущего сегмента,

Соседние файлы в папке Тамьяров А. В.