Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
64
Добавлен:
09.06.2015
Размер:
829.32 Кб
Скачать

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

Разработка и отладка программ, использующих арифметические операции над двоично-десятичными цифрами

Десятичные числа специальный вид представления информации, в основу которого положен принцип кодирования каждой десятичной цифры числа группой из четырёх бит, так называемый двоично-десятичный код

(BCD – Binari-Coded Decimal). Микропроцессор хранит BCD-числа в двух форматах:

упакованный формат каждый бит содержит две десятичные цифры. Десятичная цифра представляет собой двоичное значение в диапазоне от 0 до 9 размером 4 бита. Код старшей цифры числа занимает старшие 4 бита. Следовательно, диапазон представления десятичного упакован- ного числа в одном байте составляет от 00 до 99;

неупакованнй формат каждый бит содержит одну десятичную цифру

в четырёх младших битах. Старшие 4 бита имеют нулевое значение. Следовательно, диапазон представления неупакованного числа в одном байте составляет от 0 до 9.

Для описания двоично-десятичных чисел в программе используются только две директивы описания данных – DB и DT.

Ниже приведён пример описания неупакованных и упакованных

двоично-десятичных чисел в программе.

 

date segment

 

; cегмент данных

 

Nom-1

DB

1,3,2,3,4,6

; неупакованное BCD-число 643231

Nom-2

DT

975645

; упакованное BCD-число 975645

End date

 

; конец сегмента данных

 

Арифметические

операции

над неупакованными

двоично-

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

Для коррекции операции сложения двух однозначных неупакованных BCD-чисел существует специальная команда ААА, которая ставится после операции сложения и корректирует результат сложения. Команда работает с регистром AL и анализирует значение его младшей тетрады. Если оно меньше 9, то флаг CF сбрасывается в 0, и осуществляется переход к следующей команде. Если это значение больше 9, то выполняются такие действия:

31

к содержимому младшей тетрады AL прибавляется 6, чтобы получив- шееся число было бы десятичным;

флаг CF устанавливается в 1, фиксируя перенос в старший разряд для

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

06 = 0000 0110

+

08 = 0000 1000

=

14 = 0000 1110

Очевидно, что мы получили уже не BCD-число. Правильный результат в неупакованном BCD-формате должен быть таким: 0000 0001 0000 0100. В результате действия команды ААА в аккумуляторе AL окажется число 0000 0100 и флаг CF установится в единицу.

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

При вычитании неупакованных ВСD-чисел используется команда AAS, которая также ставится после команд вычитания SUB и SBB.

Для коррекции команд умножения неупакованных ВСD-чисел применяют команду ААМ. Эту же команду можно применять для преобразования двоичного числа в регистре AL (от 0 до 99) в неупакованное BCD-число, которое будет размещено в регистре AX: старшая цифра результата в АН, а младшая в AL.

При выполнении деления неупакованных ВСD-чисел корректирующей

командой является команда AAD,

но коррекция выполняется до основной

операции, выполняющей непосредственно деление одного ВСD-числа на

другое ВСD-число. Команду AAD также, как и команду ААМ, можно

использовать для перевода неупакованных ВСD-чисел из диапазона 0…99 в

их двоичный эквивалент.

 

 

Арифметические операции

над упакованными

двоично-

десятичными числами. Упакованные ВСD-числа можно только складывать

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

Коррекцию результатов сложения производит команда DAA. Она преобразует содержимое регистра AL в две упакованные десятичные цифры. Если результат сложения больше 99, то получившаяся в результате сложения единица запоминается в флаге CF, тем самым учитывается перенос в старший разряд.

Для коррекции результатов вычитания используется команда DAS.

По результатам выполнения арифметических операций устанавливаются все флаги.

32

К группе арифметических операций относятся также две команды, осуществляющие расширение со знаком 8- и 16- разрядных операндов. Эти команды играют вспомогательную роль при подготовке операнда используемого в качестве делимого. При выполнении деления в зависимости от разрядности делителя делимое размещается либо в 16-разрядном регистре АХ, либо в регистрах DX-АХ. При делении чисел со знаком перед заполнением указанных регистров требуется анализировать знак делимого и заполнять регистр или нулями, если делимое является положительным числом, или единицами, если делимое отрицательное. Для этого используются команды CBW (Расширение со знаком байта до слова) и CWD ( расширение со знаком слова до двойного слова). По этим командам старший разряд числа, находящегося в регистре AL (или АХ), записывается во все разряды регистра АН (или DX).

Варианты заданий к лабораторной работе 4

1.Сложить два пятибайтных упакованных двоично-десятичных числа. Ре- зультат перевести в неупакованный формат и поместить в отдельный массив.

2.Сложить два четырёхбайтных неупакованных двоично-десятичных чис- ла. Результат перевести в упакованный формат и поместить на место первого слагаемого.

3.Сделать вычитание двух четырёхбайтных неупакованных двоично- десятичных чисел. Результат перевести в ASCII-код и поместить в от- дельный массив.

4.Сделать вычитание двух шестибайтных упакованных двоично- десятичных чисел. Результат перевести в неупакованный формат и по- местить на место уменьшаемого.

5.Произвести умножение двухразрядного неупакованного числа на одно- разрядное. Полученный результат перевести в ASCII-код и переписать во второй массив.

6.Сформировать массив из десяти упакованных двоично-десятичных чи- сел чисел. Найти среднее значение. Результат перевести в ASCII-код и поместить в память.

7.Сформировать массив из десяти однобайтных двоичных чисел, пере- вести их в двоично-десятичные, сложить. Результат поместить в регистр ВХ.

8.Сформировать массив из десяти двоично-десятичных чисел. Перевести их в двоичные. Сложить первые пять чисел и последующие. Суммы по- местить в память.

9.Сформировать массив из десяти упакованных двоично-десятичных чи- сел, найти сумму первых пяти чисел и перевести её в неупакованный

33

формат, поместить в память. Каждое оставшееся число умножить на 4 и также поместить в память.

10. Сформировать массив из десяти неупакованных двоично-десятичных чисел, каждое из чисел умножить на 2, найти их сумму и поместить её в память.

Разработать и отладить два варианта программ по указанию преподава- теля.

5. ЛАБОРАТОРНАЯ РАБОТА 5 Разработка программ с использованием подпрограмм

Подпрограмму (процедуру) можно определить как правильным образом оформленную совокупность команд, которая, будучи однократно описана, при необходимости может быть вызвана в любом месте программы. Для описания последовательности команд в виде процедуры в языке ассемблера используются две директивы: PROC и ENDP.

Как обратиться к подпрограмме. Так как имя подпрограммы обладает теми же свойствами, что и обычная метка в команде перехода, то обратиться, в принципе, можно с помощью любой команды перехода. Но есть одно важное свойство, которое можно использовать благодаря специальному механизму вызова подпрограмм. Суть состоит в возможности сохранения информации о состоянии программы в точке вызова подпрограммы. Для этого в системе команд есть две команды: CALL (вызов подпрограмм) и RET (возврат из подпрограммы).

Команда CALL имеет такие же форматы (см. прил. 1), что и команда JMP, за исключением укороченного. При выполнении команды CALL происходит автоматическое запоминание в стеке текущих значений регистров CS и IP (адрес возврата из подпрограммы). В конце подпрограммы ставится команда RET, по которой из стека возвращаются сохранённые значения в Cs

иIP. При возврате из подпрограмм, расположенных в текущем сегменте кода, применяются первые два формата команды RET, причём второй формат отличается от первого тем, что к содержимому указателя стека добавляется константа, записанная во 2-м и 3-м байтах команды. Этот приём позволяет сбрасывать значения, записанные в стек при выполнении этой подпрограммы

ине используемые в дальнейшем.

Важно отметить, что одна и та же подпрограмма не может быть и ближнего, и дальнего типов. Если подпрограмма используется в текущем сегменте кода, но может вызываться и из другого сегмента программы, то она должна быть объявлена «тип far».

34

Варианты заданий к лабораторной работе 5

Выполнить указанные задания, используя подпрограммы.

1.Сформировать массив из десяти однобайтных чисел, проверить на чёт- ность, каждое чётное число умножить на своё же значение. Результат по- местить в память после исходного массива.

2.Сформировать массив из десяти однобайтных чисел, найти среди них чис- ла, превышающие число 48Н. Найденные числа перевести в ASCII-формат и поместить в память.

3.Сформировать массив из 10 двухбайтных чисел. Переписать во второй массив числа, у которых 3,5,12 разряды равны 1, умножив их на 12h.

4.Создать массив из десяти двоично-десятичных чисел, найти в нём число 20, все числа, стоящие после этого числа просуммировать с числом 25 и переписать в другой массив.

5.Сформировать массив из 10 двухбайтных чисел. Найти разницу между минимальным и максимальным значением и поместить её в регистр ВХ.

6.Сформировать массив из десяти двоично-десятичных чисел, найти в нём число 22, все числа, стоящие после этого числа, переписать в другой мас- сив, переведя их в двоичные.

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

8.Создать массив из десяти однобайтовых двоичных чисел, каждое число вычесть из числа FFh, результат поместить во второй массив.

9.Сформировать массив из 10 однобайтных чисел. Написать программу пре- образования каждого числа в соответствующий ему код ASCII. Результат

поместить в память.

10.Сформировать массив из 10 чисел в ASCII-коде. Перевести их в двоичные, найти максимальное значение и поместить его в память после исходного массива.

Разработать и отладить 2 программы

35

6. ЛАБОРАТОРНАЯ РАБОТА 6

Изучение цепочечных команды (команд обработки строк данных), команд организации циклов, команд сдвигов

Команды обработки строк данных. Строкой называют последовательность байтов, размещаемую в смежных ячейках памяти. Команды обработки строк данных также называют цепочечными командами. Цепочка понятие несколько более широкое, чем строка, и предполагает размерность операнда большую, чем байт (слово или двойное слово). Особенность всех цепочечных команд в том, что они, кроме обработки текущего элемента цепочки, осуществляют ещё и автоматическое продвижение к следующему элементу данной цепочки. Команды, обрабатывающие двойное слово, по понятным причинам в системе команд I8086-процессора отсутствуют.

Перечислим эти команды:

пересылка цепочки, производится копирование элементов из одной об- ласти памяти в другую:

MOVS адрес приёмника, адрес источника

MOVSB

MOVSW

MOVSD

сравнение цепочек, производится сравнение элементов цепочки- источника с элементами цепочки-приёмника:

CMPS адрес приёмника, адрес источника

CMPSB

CMPSW

CMPSD

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

SCAS адрес приёмника

SCASB

SCASW

SCASD

загрузка элементов из цепочки, извлекается элемент цепочки и помеща- ется в аккумулятор:

LODS адрес источника

LODSB

LODSW

LODSD

36

сохранение элемента в цепочке, переносится значение аккумулятора в элемент цепочки:

STOS адрес приёмника

STOSB

STOSW

STOSD

Следующие ниже перечисленные команды также отсутствуют в системе команд I8086.

получение элементов цепочки из порта ввода-вывода INS адрес приёмника, номер порта

INSB INSW INSD

вывод элементов цепочки в порт ввода-вывода OUTS адрес приёмника, номер порта

OUTSB OUTSW OUTSD

Всочетании со многими цепочечными командами используют префиксы повторения:

REP

REPE или REPZ REPNE или REPNZ

Цепочечная команда без префикса выполняется один раз. Размещение префикса перед командой (в поле метки) заставляет её выполняться в цикле.

Префикс REP используется с командами MOVS и STOS, при этом данные команды выполняются до тех пор, пока содержимое в регистре СХ не станет равным нулю (после выполнения каждой команды содержимое регистра CX (ЕСХ) автоматически декрементируется).

Префиксы REPE и REPZ являются синонимами, они заставляют цепочечную команду выполняться до тех пор, пока содержимое регистра СХ (ЕСХ) не равно нулю или флаг ZF равен 1. Наиболее эффективно использовать эти префиксы с командами CMPS и SCAS..

Префиксы повторения REPNE и REPNZ также синонимы, они заставляют цепочечную команду циклически выполняться до тех пор, пока содержимое регистра СХ (ЕСХ) не равно нулю или флаг ZF равен нулю. При невыполнении одного из этих условий работа команды прекращается. Данные префиксы часто используют с командами CMPS и SCAS, но для поиска совпадающих элементов цепочки.

Важно отметить формирование физического операндов: цепочка- источник находится в текущем сегменте данных, определяемых регистром DS, цепочка-приёмник должна быть в дополнительном сегменте данных,

37

адресуемом сегментным регистром ES. Таким образом, полные физические адреса операндов цепочечных команд следующие:

адрес источника пара DS:EI;

адрес приёмника пара ES:DI.

Для цепочечных команд существует понятие направления обработки строк:

от начала цепочки к её концу, т. е. в направлении возрастания адресов;

от конца цепочки к её началу, т. е. в направлении убывания адресов.

Сэтой целью используется флаг направления DF в регистре флагов:

если DF = 0, то значения индексных регистров SI, DI будут автоматиче- ски увеличиваться;

если DF = 1, то значения индексных регистров SI, DI будут автоматиче-

ски уменьшаться.

Команды организации циклов. Для удобства выполнения вычислительных циклов в систему команд введена группа из трёх команд, облегчающая программирование циклов. Эти команды используют регистр СХ(ЕСХ) как счётчик цикла.

LOOP повторить цикл.

LOOPЕ/LOOPZ – повторить цикл, пока СХ< >0 или ZF = 0.

LOOPNE/LOOPNZ – повторить цикл, пока СХ< >0 или ZF = 1.

Работа команды LOOP заключается в выполнении следующих

действий:

декремента регистра СХ (ЕСХ);

сравнение регистра СХ (ЕСХ) с нулём.

Если СХ (ЕСХ) > 0, то управление передаётся на метку перехода;

если СХ (ЕСХ) = 0, то управление передаётся на следующую после LOOP команду.

Алгоритм работы команды LOOPЕ/LOOPZ таков:

декремент регистра СХ (ЕСХ);

сравнение регистра СХ (ЕСХ) с нулём;

анализ состояния флага нуля ZF.

Если СХ (ЕСХ) > 0 и ZF = 1, то управление передаётся на метку перехода;

если СХ (ЕСХ) = 0 или ZF = 0, то управление передаётся на следующую после LOOP команду.

Работа команды LOOPNE / LOOPNZ заключается в выполнении следующих действий:

декремента регистра СХ (ЕСХ);

сравнение регистра СХ (ЕСХ) с нулём.

анализа состояния флага нуля ZF.

38

Если СХ (ЕСХ) > 0 и ZF = 0, то управление передаётся на метку пере- хода;

если СХ (ЕСХ) = 0 или ZF = 1, то управление передаётся на

следующую после LOOP команду.

Команды сдвига. Все команды сдвига перемещают биты операнда влево или вправо, они имеют следующую структуру: КОП операнд, счётчик сдвига.

Счётчик циклов может задаваться двумя способами:

статически, когда значение числа сдвигов задаётся с помощью непо- средственного операнда;

динамически, при этом значение числа сдвигов заносится в регистр CL перед выполнением команды сдвига. Следует отметить, несмотря на то, что регистр AL восьмибитовый, микропроцессор воспринимает только значения пяти младших битов счётчика, то есть значение лежит в диа-

пазоне от 0 до 31.

Все команды сдвига устанавливают флаг переноса CF за счёт сдвига очередного бита. По принципу действия команды сдвига делятся на два типа: команды линейного сдвига и команды циклического сдвига.

Линейный сдвиг. При линейном сдвиге осуществляется следующий алгоритм:

очередной сдвигаемый бит устанавливает флаг CF;

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

К командам линейного логического сдвига относятся следующие:

SHL (Shift Logical Left) – логический сдвиг влево (рис. 7)

0

7

6

5

4

3

2

1

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Флаг cf

Рис.7. Схема работы команды логического сдвига влево SHL

SHR (Shift Logical Right) – логический сдвиг вправо (рис.8).

39

Флаг cf

Рис.8. Схема работы команды логического сдвига вправо SHR

Команды арифметического линейного сдвига особым образом работают со знаковым разрядом операнда:

SAL (Shift Arithmetic Left) – арифметический сдвиг влево. Команда практически совпадает с командой SHL (рис. 9).

Флаг cf

Рис. 9. Схема работы команды арифметического сдвига влево SAL

SAR ( Shift Arithmetic Right) – арифметический сдвиг вправо (рис. 10)

Знак

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7

6

 

5

 

4

3

2

1

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Флаг cf

Рис.10. Схема работы команды арифметического сдвига вправо SAR

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

команд умножения и деления.

Циклический сдвиг. Подобные команды бывают двух типов:

команды простого циклического сдвига;

команды циклического сдвига через флаг переноса

40

Соседние файлы в папке Радиоавтоматика и МП