Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ_II_05.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
501.25 Кб
Скачать

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

Арифметические и логические операции в цифровых устройствах

3.1. Цель работы

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

3.2. Теоретические сведения

Создание в 1971 г. фирмой Intel первой программируемой ИМС явилось началом эпохи микропроцессорной техники. Отличие микропроцессоров (МП) от обычных ИМС состоит в том, что они содержат в своем составе управляющие элементы, позволяющие настроить их на выполнение любых операций, т.е. на реализацию любой зависимости между последовательностью входных и выходных сигналов. То обстоятельство, что ИМС с перестраиваемой логикой способны при соответствующей «настройке» выполнять любые функции, делает их универсальными и полностью снимает противоречие между степенью интеграции и требуемым объемом производства. Набор управляющих сигналов, настраивающих ИМС на выполнение определенной функции, называется микрокомандой. Развитие программно-перестраиваемой логики привело к тому, что ИМС стали выполнять не одну, а последовательность микрокоманд, т.е. алгоритм. Возникли ИМС с микропрограммным управлением. Одной из реализацией ИМС с микропрограммным управлением и явились микропроцессоры. На основе всякого МП можно построить систему, реализующую практически любое преобразование последовательности электрических сигналов. Если эти сигналы будут являться носителями информации, то очевидно, что такая система сможет обрабатывать практически любую информацию.

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

- команды пересылки данных;

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

- команды управления потоком команд;

- команды ввода/вывода.

Пересылка данных может осуществляться между регистрами процессора, между регистрами и ячейками памяти, а так же между ячейками памяти. В любой такой команде указывается операнд-источник, операнд-назначение и длина пересылаемых данных. К командам пересылки данных так же относятся операции со стеком. Стек – это область памяти, по своей структурной организации отличающаяся от основной памяти. Стек организуется в соответствии с принципом LIFO (Last In First Out – «последним зашел – первым ушел). Для выполнения операций обмена со стеком определены две явные операции – заталкивание в стек (обычно обозначается как push) и выталкивание из стека (обычно обозначается как pop). Данные помещаются и снимаются с вершины стека, на которую, как правило, указывает содержимое специального регистра процессора, называемого указателем стека – SP (Stack Pointer). Перед каждой записью данных в стек или извлечения их из стека содержимое регистра SP будет, соответственно, либо уменьшаться, либо увеличиваться. Величина, на которую будет корректироваться содержимое регистра SP, будет зависеть от разрядности помещаемых в стек данных. Кроме того, стек используется во многих случаях не явно. Например, при вызове подпрограмм в стек помещается адрес возврата.

В основной набор логических операций, выполняемых МП как минимум включаются операции И, ИЛИ, НЕ, ИКЛЮЧАЮЩИЕ ИЛИ, которые выполняются поразрядно. Например, требуется выполнить операцию И над двумя восьмиразрядными числами E4h и 96h. В этом случае, результат выполнения операции будет выглядеть следующим образом:

1 1100100b

1 0010110b

10000100b

Здесь суффиксы b и h означают представление числа в двоичной и шестнадцатеричной системе счисления соответственно.

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

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

Операция сложения двух одноразрядных переменных выполняется по правилам:

0+0=0

0+1=1

1+0=1

1+1=10

Операция вычитания двух одноразрядных выполняется по следующим правилам:

0-0=0

1-0=1

1-1=0

0-1=-1

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

1) проинвертировать исходное число, представленное в прямом дополнительном коде;

2) прибавить к результату единицу.

Наиболее доступными для изучения выполнения арифметических и логических операций в МП являются процессоры Intel семейства х86. Для того чтобы посмотреть на выполнение этих операций требуется ассемблер и отладчик. Для процессоров семейства х86 можно воспользоваться пакетом TASM.

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

%TITLE «Необязательный – описывает назначение программы»

IDEAL; определяет режим ассемблирования

MODEL small; задает модель памяти

STACK 256; определяет размер стека в 256 байт

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

DATASEG

numRows DB 25; определить байт

numColums DB 80

videoBase DW 0B800h; определить слово

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

END Start ; Конец программы/ точка входа

Директива END помечает конец текста исходной программы. Справа от директивы END определяется метка, с которой начинается выполнение программы. Обычно она совпадает с меткой, указывающей на первую команду, следующую за директивой DATASEG.

    1. . Программа работы

3.3.1. Использование команд пересылок

В любом текстовом редакторе набрать следующую программу и сохранить ее с расширением .asm

Программа 3.1 mov.asm

1: %TITLE «Использование команды mov»

2: MASM

3: MODEL small

4: .STACK 256

5: .DATA

6: exCode DB 0

7: var DB 99 ; однобайтовая переменная

8: .CODE

9: Start:

10: mov ax, @data ; установка в DS

11: mov ds, ax ;адреса сегмента данных

12: mov ax, 1 ; переслать конкретные данные

13: mov bx, 2 ; в регистры

14: mov cx, 3

15: mov dx, 4

16: mov ah, var ;загрузить значение speed в ah

17: mov si, offset var1 ;загрузить адрес speed в si

18: Exit:

19: mov ah, 04Ch ;функция DOS:выход из программы

20: mov al, exCod ;возврат значения кода ошибки

21: int 21h ;вызов DOS. Останов программы

22: END Start ;конец программы/ точка входа

После набора программы следует выполнить трансляцию программы. На этом шаге формируется объектный модуль, который включает в себя представление исходной программы в машинных кодах и некоторую другую информацию, необходимую для отладки и исполнения его с другими модулями. Для получения объектного модуля исходный файл необходимо подвергнуть трансляции при помощи программы tasm.exe из пакета TASM. Формат командной строки для запуска tasm.exe следующий:

TASM [опции] имя_исходного_файла [, имя_объектного_файла] [,имя_файла_листинга] [,имя_файла_перекрестных ссылок]

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

В результате выполнения tasm.exe на экране будет получена последовательность строк. Первая из них информирует о номере версии пакета TASM, который использовался для трансляции данной программы. Далее идет строка, содержащая имя транслируемого файла. Дальше идут строки содержащие указания на ошибки и предупреждения. Место ошибки определяется по значению в скобках в сообщение об ошибке. Этот способ локализации ошибок имеет недостатки – не всегда номера строк в сообщении соответствуют действительным номерам ошибочных строк в исходном файле (например, при использовании макрокоманд). Поэтому лучше использовать для локализации ошибок информацию из специального, создаваемого транслятором файла листинга. Файл листинга имеет расширение .lst и содержит код ассемблера исходной программы и расширенную информацию об этом коде. Для каждой команды ассемблера указываются ее машинный (объектный) код и смещении в кодовом сегменте. Кроме того, в конце листинга TASM формирует таблицы, которые содержат информацию о метках и сегментах, используемых в программах. Если есть ошибки и сомнительные участки кода, то TASM включает в конце листинга сообщения о них. Эти же сообщения включаются в текст листинга после ошибочной строки.

После создания исходного файла с расширением *.asm, следует выполнить его трансляцию, набрав в командной строке любого менеджера файлов (FAR, NC и т.д.) следующую строку:

tasm /zi mov.asm , , ,

После успешной трансляции создается объектный файл mov.obj. Если файл с расширением *.obj не получен, то это говорит о том, что в исходном файле с расширением *.asm были ошибки. Локализовать их можно, либо посмотрев файл листинга (.lst), либо нажав Ctrl^0. Применение ключа /zi разрешает транслятору сохранить связь символических имен в программе и их смещений в сегменте кода. После получения объектного файла mov.obj следует выполнить его компоновку, набрав в командной строке любого менеджера файлов (FAR, NC и т.д.) следующую строку:

tlink/v mov.obj

После успешной компоновки создается исполняемый файл mov.exe. Ключ /v указывает компоновщику на необходимость отладочной информации в исполняемом файле. После получения исполняемого файла следует запустить его в отладчике, набрав в командной строке любого менеджера файлов следующую строку:

td mov.exe

Перейдя в главное меню (верхняя строка) нажав клавишу F10, выбрать в нем пункт View (Обзор) и подпункт CPU (центральный процессор). В этом случае в отладчике раскроется окно, в котором будет отображаться исходный текст программы и двоичные коды команд; содержимое регистров процессора и состояние его регистра флагов; состояние стека и области данных программы.

Выполнить программу mov.exe в шаговом режиме. Выполнение программы в пошаговом режиме осуществляется путем нажатия на клавиши F7 или F8 (различия между ними заключаются в том, что при нажатии на F7 будет осуществляться заход в процедуры, а на F8 нет). Регистры, содержимое которых изменяется на данном шаге, подсвечиваются белым цветом.

3.3.2. Работа со стеком

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

Программа 3.2 stak.asm

1: %TITLE «Использование команды mov»

2: MASM

3: MODEL small

4: .STACK 256

5: .DATA

6: exCode DB 0

7: var DB 99 ; однобайтовая переменная

8: .CODE

9: Start:

10: mov ax, @data ; установка в DS

11: mov ds, ax ;адреса сегмента данных

12: push ax ;сохранить ax и bx

13: push bx ;в стеке

14: mov ax, -1 ;установка тестовых значений

15: mov bx, -2

16: mov cx, 0

17: mov dx,0

18: push ax ;занос в стек содержимого

19: push bx ;регистров ax, bx

20: pop cx ;извлечение данных из стека

21: pop dx

22: pop bx

23: pop ax

24: Exit:

25: mov ah, 04Ch ;функция DOS:выход из программы

27: mov al, exCode ;возврат значения кода ошибки

28: int 21h ;вызов DOS. Останов программы

29: END Start ;конец программы/ точка входа

Выполнить ассемблирование и компоновку программы stack.asm и запустить ее в Turbo Debugger в шаговом режиме.

3.3.3. Использование директив резервирования и инициализации

Директивы не имеют аналогов в системе команд МП, а просто являются

указаниями транслятору, предписывающему ему выполнение определенных действий. Так обращение к операндам, используемым в программе, исполняемой микропроцессором, происходит по их адресам. В то же время человеку удобно оперировать с символическими именами. Поэтому в современных трансляторах существует возможность присвоения какой-либо области памяти символического имени и дальнейшего обращения к этой области памяти по символическому имени. Микропроцессорами Intel семейства х86 поддерживаются следующие целочисленные форматы данных: биты; битовые поля; байты (8 бит); слова (16 бит); двойные слова (32 бит); учетверенные слова (64 бита), строки бит; строки байт; строки слов; строки двойных слов двоично-десятичные числа, представленные в двух форматах упакованном и неупакованном; указатели; короткие указатели; длинные указатели. Для описания байт, слов, двойных слов и учетверенных слов применяются директивы:

-для байта db (define byte –определить байт);

-для слова dw (define word – определить слово);

-для двойного слова dd (define double word – определить двойное слово);

-для учетверенного слова dq (define quade word – определить учетверенное

слово).

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

Описать в сегменте данных инициализированные области памяти размером

байт, слово, двойное слово, инициализированную каким-то одним значением область памяти размером 10 байт, неинициализированную область памяти размером в 5 байт, слово и двойное слово в правой части, которых в директивах резервирования и инициализации стоит имя области памяти, используемое ранее для инициализации двойного слова, строчку ASCII символов (конец строки обозначается знаком $). Оттранслировав и скомпоновав программу посмотрите в отладчике как будут представлены, описанные данные. С помощью функции 09h прерывания int 21h выведите строчку ASCII символов на экран. Для вывода:

mov ah, 09h

mov dx, offset message

int 21h

3.3.4. Использование арифметических и логических команд

Для выполнения сложения и вычитания операндов применятся команды соответственно команды add и sub. Например, команда add ax, bx прибавит к содержимому регистра ax содержимое регистра bx и результат поместит в регистр ax. Команда sub cx, ax вычтет из содержимого регистра cx содержимое регистра ax и результат поместит в регистр cx. Для умножения и деления беззнаковых значений используются соответственно команды mul и div, для знаковых значений – imul и idiv.

Для умножения предназначена команда mul сомножитель_1. Второй операнд задается неявно и его местоположение фиксировано. Так как в общем случае результат умножения больше, чем любой из его сомножителей, то его размер и местоположение также должны быть определены однозначно. Варианты размеров сомножителей и размещения второго операнда и результата приведены в табл. 3.1. Если в результате выполнения операции старшая часть результата получилась нулевая, то флаги cf и of сбрасываются в 0. Если эти флаги установлены в 1, то это означает, что результат вышел за пределы младшей части произведения и состоит из двух частей, что нужно учитывать при дальнейшей работе.

Таблица 3.1

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]