Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
prn_ 51_pr1.doc
Скачиваний:
17
Добавлен:
19.02.2016
Размер:
370.18 Кб
Скачать

Контрольные вопросы.

  1. В чем заключается различие команд MOV, MOVC и MOVX .

  2. Назовите возможные операнды вышеперечисленных команд.

  3. Каким образом можно зарезервировать память в программе .

  4. К какой памяти можно обращаться с помощью DPTR .

  5. Можно ли командой MOV смоделировать работу команд XCH,XCHD. Обоснуйте ответ.

6. Охарактеризовать методы адресации, используемые в формате команды пересылки данных MOV.

7. Каким образом осуществляется в МК51 доступ к памяти программ (ПП).

8. Как производится загрузка регистра-указателя данных DPTR 16-битным адресом. При доступе к какой части памяти МК51 и с помощью какой команды используется этот регистр.

9. Описать механизм выполнения стековых операций в МК51. Для каких целей используются подобные операции.

10. Оценить количество рабочих циклов МК51, необходимое для выполнения отдельных команд пересылки данных С по заданию преподавателя).

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

АРИФМЕТИЧЕСКИЕ КОМАНДЫ

Практическая часть.

I. Инкремент и декремент.

Декрементировать содержимое ячеек резидентной памяти данных (РПД) по адресам 10-20

MOV R0,#10 ; Загрузка в R0 начального адреса

MOV R3, #20-10+1 ; Загрузка в R3 числа ячеек

L: DEC @R0 ; Декремент ячейки РПД

INC R0 ; Продвижение указателя адреса

DJNZ R3,L ; Декремент R3 и повтор, пока R3 не равно нулю

II. Сложение и вычитание.

  1. Команды ADDC и SUBB учитывают предыдущее состояние флажка переноса (заема), что позволяет производить вычисления с двойной точностью путем повторения операции над последующими старшими байтами операнда. Если входными данными для операции является строка целых чисел без знака, то флажок переноса установится после завершения операции при переполнении (для ADDC) или при исчезновении значащих разрядов (для SUBB). Для отрицательных данных, представленных дополнительным кодом, старший разряд старшего байта исходных данных содержит знак строки, поэтому флажок переполнения (OV) будет указывать на переполнение или исчезновение значащих разрядов.

Рассмотрим выполнение программы, суммирующей два двоичных многобайтных числа. Оба слагаемых располагаются в резидентной памяти данных (РПД), начиная с младшего байта. При сложении чисел без знака на переполнение укажет флаг С, а в случае сложения чисел со знаком – флаг OV.

N EQU 10 ; Формат операндов в байтах

ORG 20H

NUM1 DS N ; Память для первого числа

NUM2 DS N ; Память для второго числа

ORG 0C100H ; Установка программного счетчика на адрес 0C100h

MOV R0,#NUM1 ;Запись в R0 начального адреса первого числа

MOV R1,#NUM2 ;В R1 – начальный адрес второго числа

MOV R2,#N ;В R2 – формат операндов в байтах

CLR C ;Сброс переноса

L1: MOV A,@R0 ;Загрузка в аккумулятор текущего байта первого слагаемого

ADDC A,@R1 ;Сложение байт с учетом переноса

MOV @R0,A ;Размещение байта результата

INC R0 ;Продвижение указателей

INC R1

DJNZ R2,L1 ;Цикл, если не все байты просуммированы

END

2. Программа складывает многобайтные BCD-числа, расположенные в резидентной памяти данных (РПД). Регистры R0 и R1 указывают начальные адреса слагаемых. Слагаемые расположены в РПД, начиная с младших байтов. Формат слагаемых одинаков и задается в R2 числом байтов. Результат сложения помещается на место первого слагаемого:

; Суммирование Z=W+Y

; (R0) – начальный адрес W

; (R1) – начальный адрес Y

; (R2) – длина слагаемых W и Y

CLR C ; Сброс флага переноса

L: MOV A,@R0 ; Загрузка текущего байта W

ADDC A,@R1 ; Сложение

DAA ; Коррекция

MOV @R0,A ; Размещение текущего байта результата

INC R0 ; Продвижение указателей байт слагаемых

INC R1

DJNZ R2,L ; Декремент R2, повтор, пока R2 не равно 0

3. Программа вычитает строку, указанную регистром R1, из строки, указанной регистром R0, с точностью, указанной регистром R2. После выполнения операции проверяется переполнение результата.

SUB: CLR C ; 3аем=0

BEG: MOV A,@R0 ; Загрузка байта уменьшаемого

SUBB A,@R1 ; Вычитание байта

MOV @R0,A ; Запоминание байта разности

INC R0 ; Установка указателей на следующее

INC R1 ; поле

DJNZ R2,BEG ; Выполнение цикла до завершения операции

; После завершения цикла проверяется ситуация переполнения в последней итерации.

JNB OV,OK

; ..............

; Программа восстановления старших

; разрядов

OK: RET

III. Умножение и деление.

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

Например, если аккумулятор содержал число 200 (0C8H), а расширитель 160 (0A0H), то в результате выполнения команды MUL АВ получится произведение 32000 (7D00H). Аккумулятор будет содержать нуль, а расширитель - 7DH, флаг OV будет установлен, а флаг С – сброшен.

1. Пусть требуется умножить целое двоичное число на константу. Исходное число размещается в резидентной памяти данных (РПД), адрес младшего байта находится в регистре R0. Формат числа в байтах хранится в R0:

CONST EQU 123

MOV A,#0 ; Сброс аккумулятора

L: ADD A,@R0 ; Загрузка множимого

MOV B,#CONST ; Загрузка множителя

MUL AB ; Умножение

MOV @R0,A ; Запись младшего байта частичного произведения

INC R0 ; Приращение адреса

MOV A,B ; Пересылка старшего байта частичного произведения в аккумулятор

XCH A,@R0 ; Предварительное формирование очередного байта произведения

DJNZ R1,L ; Цикл, если не все байты исходного числа умножены на константу

Полученное произведение размещается на месте исходного числа и занимает в РПД на один байт больше.

2. Команда DIV производит деление содержимого аккумулятора на содержимое регистра-расширителя. После деления аккумулятор содержит целую часть частного, а расширитель – остаток. Флаги C и OV сбрасываются. При делении на нуль устанавливается флаг переполнения, а частное остается неопределенным.

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

Программа BINBCD выполняет преобразование целого двоичного 8-разрядного числа без знака, содержащегося в регистре А (значение в интервале 0-255), в трехзначное число двоично-кодированного формата BCD (два байта). Число сотен возвращается в поле переменной HUND, а числа десятков и единиц возвращаются в двоично-десятичном упакованном коде в поле другой переменной TENONE.

; BINBCD Выполняет преобразование 8-разрядного двоичного

; числа, хранящегося в регистре, в трехзначное число в

; двоично-десятичном упакованном формате.

; Число сотен размещено слева в поле переменной HUND,

; а числа десятков и единиц размещены в переменной TENONE.

ORG 21H

HUND DS 1

TENONE DS 1

BEG: MOV В,#100 ; Разделить на 100 для определения числа сотен

DIV АВ ; Разделить остаток на 10

MOV HUND ; для определения числа

MOV А,#10 ; сотен слева

ХСН А,В ; Цифра десятков в А

DIV АВ ; Остаток - цифра единиц

SWAP A ; В А цифры в двоично-десятичном упакованном формате

ADD А,В

MOV TENONE,A

RET

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

Например, выполняя деление упакованного двоично-десятичного данного на 16 можно отделить два полубайта, старшие разряды в аккумуляторе, а младшие (остаток) - в регистре В. Каждое данное выровнено вправо и, следовательно, может обрабатываться отдельно.

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

; DISBCD Выполняет распаковку двух упакованных двоично-

; десятичных чисел, полученных в аккумуляторе, и возвращает их

; произведение в аккумулятор также в двоично-десятичном

; упакованном формате

BEG: MOV B,#10H ; Исходное значение делится

DIV АВ ; на 16. В регистрах А и В хранятся выделенные цифры

; (каждая выровнена вправо)

MUL АВ ; Регистр А содержит произведение в двоичном формате

; (0-99(десятичное)=0-63Н)

MOV В,#10 ; Произведение делится

DIV АВ ; на 10. Регистр А содержит цифру десятков,

; В содержит остаток

SWAP А ; Цифры в упакованном

ORL А,В ; формате

RET

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