Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
mIKROPROTsESSORY / LABMP_ALL_2013.doc
Скачиваний:
109
Добавлен:
09.04.2015
Размер:
2.25 Mб
Скачать

2.5. Лабораторное занятие

2.5.1. Основы работы с массивами чисел

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

myarr: db 20h,21h,22h,23h,24h,25h,26h,27h,28h,29h

Псевдооператор DB задает в ячейке с заданным адресом байт, который указан в качестве аргумента. Для приведенного примера в памяти команд, начиная с текущего адреса (например, после кодов программы) записываются 10 байт с указанными значениями.

Далее при необходимости использовать этот массив надо сначала записать в регистр DPTR адрес массива и затем считать определенное значение в аккумулятор:

mov dptr,#myarr ; установка DPTR на начало массива

movc a,@a+dptr ;считывание байта из памяти программ в А

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

Ниже приведена программа перезаписи содержимого массива с именем myarr, заданного после адресов этой программы, в массив mysec, зарезервированный во внешней памяти данных с адреса 0000Н.

Программа 3

NAME TEST4

XSEG AT 0000h; задание сегмента внешней памяти данных

mysec: ds 20h ; резервирование 20 байт в этом сегменте

DSEG AT 10h ; задание сегмента внутренней памяти данных (при ;необходимости)

CSEG AT 8000h; задание сегмента памяти программ с адреса 8000Н

ORG 8000h; задание адреса начала программы с 9000Н

mov r0,#10; в r0 – количество перезаписываемых байт

call 23ddh; вызов подпрограммы отображения состояния процессора ;на LCD

mov dptr,#myarr; запись в dptr адреса начала массива в памяти ;программ

call 23ddh

mov a,#0h

call 23ddh

mov r2,dph; сохранение в r2 и r3 адреса текущего байта в массиве

call 23ddh

mov r3,dpl; в памяти программ

call 23ddh

mov dptr,#mysec; запись в dptr адреса начала массива во внешней

;памяти данных

call 23ddh

mov r4,dph; сохранение в r4 и r5 адреса текущего байта в массиве

call 23ddh

mov r5,dpl; во внешней памяти данных

call 23ddh

mov dptr,#myarr

call 23ddh

m1: mov a,#0; обнуление аккумулятора

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

;аккумулятор

call 23ddh

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

call 23ddh

mov r2,dph; сохранение в r2 и r3 адреса текущего байта в массиве

call 23ddh

mov r3,dpl;в памяти программ

call 23ddh

mov dph,r4;восстановление из r4 и r5 адреса текущего байта в

call 23ddh

mov dpl,r5;массиве во внешней памяти данных

call 23ddh

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

;данных

call 23ddh

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

call 23ddh

mov r4,dph; сохранение в r4 и r5 адреса текущего байта в массиве

call 23ddh

mov r5,dpl;во внешней памяти данных

call 23ddh

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

;массиве в памяти программ

call 23ddh

mov dpl,r3

call 23ddh

djnz r0,m1; вычитание из счетчика байтов 1 и проверка на нуль

ret;возврат из программы

myarr: db 20h,21h,22h,23h,24h,25h,26h,27h,28h,29h;Задание массива

; в памяти программ

call 23ddh

ret

end

Соседние файлы в папке mIKROPROTsESSORY