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

2.3.2. Пересылка из одной области памяти в другую

2.3.2.1. Переслать 5 байт из внешней памяти данных во внутреннюю. Начальный адрес 1-го байта - 0000н, переслать надо в область, начиная с адреса 20н.

Распределение ресурсов: Здесь, в отличие от задачи 2.3.1.2, внешняя память данных используется только один раз за цикл, поэтому нет необходимости сохранять состояние DPTR в регистрах.

NAME MOVEIE

Beg: mov dptr, #0000h ;загрузка в указатель адрес начала массива во внешней памяти

mov r0,#20h ;загрузка в указатель адрес начала массива во внутр. памяти

mov r3,#5 ;загрузка в счетчик числа передаваемых байт

m1: movx a,@dptr ;пересылка из внешней памяти в А

mov @r0,a ;пересылка из А в массив во внутренней памяти

inc dptr ;увеличение адреса текущего байта во внешн. памяти

inc r0 ;увеличение адреса текущего байта во внутр. памяти

djnz r3,m1 ;вычитание из счетчика 1 и проверка его на 0, если не 0, то повтор обмена

END

2.3.2.2. Переслать 10 байт из внутренней памяти данных во внешнюю. Начальный адрес 1-го байта - 20н, переслать надо, начиная с адреса 2000н.

Распределение ресурсов: Полностью аналогична задаче 2.3.2.1, но направление передачи обратное. Внешняя память данных используется только один раз за цикл, поэтому нет необходимости сохранять состояние DPTR в регистрах.

NAME MOVEEI

Beg: mov dptr, #2000h ;загрузка в указатель адрес начала массива во внешней памяти

mov r0,#20h ;загрузка в указатель адрес начала массива во внутр. памяти

mov r3,#10 ;загрузка в счетчик числа передаваемых байт

m1: mov a, @r0 ;пересылка в А числа из массива во внутренней памяти

movx @dptr,а ;пересылка во внешнюю память из А

inc dptr ;увеличение адреса текущего байта во внешн. памяти

inc r0 ;увеличение адреса текущего байта во внутр. памяти

djnz r3,m1 ;вычитание из счетчика 1 и проверка его на 0, если не 0, то повтор обмена

END

2.3.2.3. Переслать 10 байт из памяти команд во внешнюю память данных. Начальный адрес 1-го байта - метка array1:, переслать надо, начиная с адреса 2000н.

Распределение ресурсов: Здесь, в отличие от задачи 2.3.2.1, пересылки осуществляются из памяти команд во внешнюю память данных. В качестве указателя при этом может выступать только указатель данных DPTR. Однако он один, а областей данных две. Поэтому приходится запоминать текущий адрес первого массива в паре регистров (например, R0, R1), а адреса второго массива в регистрах R2, R3. Счетчик байт будет организован в R5.

NAME MOVEРE

Beg: mov dptr #ARRAY1 ;загрузка в указатель адреса начала 1-го массива

mov r0, dph ;сохранение содержимого ст. байта указателя в регистре

mov r1,dpl ;сохранение содержимого мл. байта указателя в регистре

mov dptr #2000h ;загрузка в указатель адреса начала 2-го массива

mov r2, dph ;сохранение содержимого ст. байта указателя в регистре

mov r3,dpl ;сохранение содержимого мл. байта указателя в регистре

mov r5,#10 ;загрузка в счетчик числа передаваемых байт

m1: mov dph, r0 ;восстановление из регистров текущего состояния

mov dpl, r1 ;указателя на 1-й массив

mov a,#0 ;

movc a, @a+dptr ;пересылка байта из массива в А

inc dptr ;увеличение указателя на 1

mov r0, dph ;сохранение содержимого мл. байта указателя в регистре

mov r1, dpl ;сохранение содержимого мл. байта указателя в регистре

mov dph, r2 ;восстановление из регистров текущего состояния

mov dpl, r3 ;указателя на 2-й массив

movx @dptr, a ;пересылка байта из А в массив

inc dptr ;увеличение указателя на 1

mov r2, dph ;сохранение содержимого мл. байта указателя в регистре

mov r3, dpl ;сохранение содержимого мл. байта указателя в регистре

djnz r5,m1 ;вычитание из счетчика 1 и проверка его на 0, если не 0, то повтор обмена

END

2.4.1. Переслать массив двухбайтных чисел из внешней памяти во внутреннюю. Адрес исходного массива -2000Н, адрес, куда пересылать - 20Н. Количество элементов массива - в регистре R3.

Распределение ресурсов: Здесь, задача подобна задаче 2.3.2.1, но во внешней памяти данных хранятся двух байтные числа. Можно использовать этот алгоритм, только удвоить количество чисел в регистре R3, однако если оно близко к 128, то регистр может переполниться. Тогда можно воспользоваться методом передачи двух байт за цикл.

NAME MOVEВ

Beg: mov dptr, #2000h ;загрузка в указатель адрес начала массива во внешней памяти

mov r0,#20h ;загрузка в указатель адрес начала массива во внутр. памяти

mov r3,#NUMB ;загрузка в счетчик числа передаваемых двухбайтных чисел

m1: movx a,@dptr ;пересылка из внешней памяти в А первого байта

mov @r0,a ;пересылка из А в массив во внутренней памяти

inc dptr ;увеличение адреса текущего байта во внешн. памяти

inc r0 ;увеличение адреса текущего байта во внутр. памяти

movx a,@dptr ;пересылка из внешней памяти в А второго байта

mov @r0,a ;пересылка из А в массив во внутренней памяти

djnz r3,m1 ;вычитание из счетчика 1 и проверка его на 0, если не 0, то повтор обмена

END

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