Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка (НСиНК) - лабораторные работы.doc
Скачиваний:
24
Добавлен:
15.04.2015
Размер:
356.35 Кб
Скачать

2.3. Регистры процессора

2.3.1. Основные регистры

К основным регистрам процессора относятся 8 адресных регистров: ar0 - ar7( sp ) и 8 регистров общего назначения: gr0 - gr0, которые используются в большинстве вычислитель­ных операций процессора. Все они 32-разрядные, доступны как по чтению, так и по записи.

Адресные регистры

Адресные регистры делятся на две равноправные группы. В первую входят ar0-ar3 , а во вторую - ar4..ar7 . Это связано с наличием двух адресных устройств в процессоре.

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

Примеры использования адресных регистров:

ar0 = ar5; // копирование .

ar2 = ar3 + gr3; // модификация.

[ar4++] = gr7 with gr7 -= gr4 ; // запись в память.

Адресный регистр ar7 используется процессором в качестве указателя стека адресов возврата sp(Stack Pointer) . Это означает, что ar7 модифицируется автоматически, когда происходит вызов функции или прерывания, а также возврат из функции или из прерывания.

 Регистры общего назначения

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

[gr0] = gr4; // запись значения регистра gr4 в память

// по адресу, хранящемуся в gr0.

Однако адресные регистры обладают в этом смысле значительно более широкими возможностями.

Примеры использования регистров общего назначения:

gr0 = gr5; // копирование.

gr2 = gr1 + gr3; // модификация.

[ar4++] = gr7 with gr7 -= gr4 ; // запись в память.

3. Порядок выполнения работы

Практическая часть работы предполагает разработку несложной программы на ассемблере. Программа заполняет блок памяти возрастающими значениями, а затем выполняет некоторые манипуляции над ним. Блок памяти (или массив) будем рассматривать состоящим из элементов определённой разрядности. Для простоты будем брать только кратные двум разрядности (например, 2, 4, 8, 16, 32, 64 бит), чтобы блок всегда можно было представить из целого количества таких элементов. При этом элементы имеют порядковые номера от начала блока: 0, 1, 2,… Под четными/нечетными элементами будем понимать элементы с четными/нечетными порядковыми номерами. Ещё раз следует обратить внимание на то, что нумерация начинается с нуля , а ноль – это четное число. Также следует уточнить, что понимается под положительными/отрицательными числами. Все числа, старший разряд которых =1, процессор воспринимает как отрицательные, а все остальные - как положительные.

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

Для отладки программы воспользуемся специальным отладчиком emudbg . exe , поставляемым вместе с пакетом разработчика для процессора NM6403.

Задание

1. Заполнить блок памяти размером в 8 64-разрядных слов (или, что то же самое, – 16 32-разрядных слов) элементами длиной 32 бита, возрастающими с INC на INC , где INC = текущий год * (номер бригады + количество человек в бригаде + сумма цифр номера группы). Написать программу для выполнения этого задания (см. разобранный пример для 11 варианта), скомпилировать её в выполняемый файл (*.abs) и отладить её на отладчике emudbg . exe . Зафиксировать в отчете полученный блок памяти с указанием его начального и конечного адреса.

Для написания текста программы следует воспользоваться любым текстовым редактором, не сохраняющим символы форматирования (например, notepad . exe ). Файл следует сохранить с расширением *. asm .

Для компиляции полученного файла необходимо поместить его в каталог, где установлен пакет разработчика для NM 6403. Это может быть каталог: С:\ Program Files \­ Module \ Nmsdk \ bin \ или другой по указанию инженера. Из этого каталога следует запустить программу компилятора следующей командой: nmcc -g step1.asm libc.lib –m, где step1. asm – имя файла с исходными текстами вашей программы. Рекомендуется создать командный (*. bat ) файл с этой командой, чтобы не вводить её каждый раз, а запускать уже этот файл. Если компиляция пройдёт успешно, то в этом же каталоге будут созданы несколько файлов с тем же именем, но с другими расширениями. Нас будут интересовать следующие из них: *.аbs- выполняемый файл, открываемый из отладчика emudbg . exe , *. map – файл карты памяти, в котором можно просмотреть начальные адреса переменных (то, что объявляется в секциях данных) в памяти для наблюдения за их содержимым в процессе отладки. Если же в процессе компиляции будут обнаружены ошибки в тексте программы, компилятор сообщит о них выводом сообщений с указанием номера строки, в которой обнаружена ошибка.

Для отладки скомпилированной программы следует запустить программу emudbg . exe всё из того же каталога. Затем в главном меню выбрать пункт: Цель->Загрузить программу и в появившемся диалоге указать *. abs -файл вашей программы. Чтобы просмотреть различные ресурсы процессора, память и дизассемблированный или исходный код программы, следует обратиться к соответствующим подпунктам меню Вид. Рекомендуется одновременно следить как минимум за содержимым памяти, используемых программой скалярных и векторных регистров, конфигурацией рабочей матрицы и текущей выполняемой строкой исходного текста. Для доступа к ним необходимо открыть следующие пункты меню Вид: Память, Регистры, Специфика целевой среды и Исходные тексты->Ваш файл *. asm . При этом память во многих случаях будет удобнее просматривать не 32-разрядными словами, а 64-разрядными. Для этого: щелчок правой кнопкой мыши в окне Память-> 64-битные слова. На панели инструментов отладчика расположены кнопки быстрого доступа к наиболее используемым командам, всплывающие подсказки поясняют их назначение. Нам понадобятся: Шаг простой / Шаг обходящий – любой из них для выполнения текущей команды; Снять / поставить точку останова; Запуск / Анимация – любая из них для выполнения уже хорошо отлаженной части программы до точки останова, чтобы не использовать многократно Шаг простой / Шаг обходящий. Чтобы выгрузить программу из отладчика, но оставить конфигурацию процессора и содержимое памяти без изменений, следует выбрать: Цель->Выгрузить программу. Если же необходим полный сброс процессора в исходное состояние, то следует выбрать: Цель->Перезагрузить цель.

2. Выполнить обработку полученного блока памяти (массива) в соответствии с вариантом для вашей бригады.

Вариант 1. Вычислить контрольную сумму блока памяти (количество единичных бит) и записать её сразу за концом блока.

Рекомендации по выполнению: воспользуйтесь операцией взвешенного суммирования, разбив рабочую матрицу на 32 строки и 1 столбец. На первом этапе вычислите сумму четных единичных бит блока памяти (нумерация, как и для элементов блока памяти, начинается с нуля, а ноль – четное число). Полученные восемь 64-разрядных частичных сумм запишите в память для их временного хранения. На втором этапе вычислите сумму нечетных единичных бит. На третьем этапе просуммируйте частичные суммы четных и нечетных бит. Выгрузите полученные восемь 64-разрядных частичных сумм в память для их временного хранения. На четвертом этапе просуммируйте полученные частичные суммы на скалярном процессоре (см. разобранный пример для 11 варианта) и запишите результат в память. Для того чтобы получить доступ к четным/нечетным битам входа Х, необходимо воспользоваться блоком маскирования, задав соответствующие векторы масок:

EvenMask: long = 05555555555555555hl; // маска для четных бит (0101).

OddMask: long = 0aaaaaaaaaaaaaaaahl; // маска для нечетных бит (1010).

Вектор масок следует хранить в ram , причем столько 64-разрядных слов, сколько раз выполняется векторная команда (в нашем случае – 8). Кроме того, при суммировании нечетных бит необходимо подключить регистр сдвига, т.к. разрядность элементов входа Х – 2 бита. Во избежание путаницы следует четко представлять последовательность выполнения всех этих операций в процессоре (см. предыдущую работу).

Вариант 2. Прибавить всем четным элементам разрядностью 16 бит сегодняшнее число. Затем вычислить сумму 0-го и 1-го 64-разрядных элементов и записать её сразу за концом блока.

Вариант 3. Умножить каждый элемент блока памяти разрядностью 8 бит на количество человек в бригаде. Затем найти разность между 2-м и 0-м 32-разрядными элементами и записать её сразу за концом блока 64-разрядным словом с обнулением старших 32 разрядов этого слова.

Вариант 4. Вычесть из каждого нечетного элемента разрядностью 32 бита предыдущий (четный) элемент. Затем найти результат логического «или» 0-го и 4-го элементов разрядностью 16 бит и записать его сразу за концом блока 64-разрядным словом с обнулением старших 48 разрядов этого слова.

Рекомендации по выполнению: для выполнения первой части задания воспользуйтесь операцией взвешенного суммирования. Задайте необходимое разбиение рабочей матрицы и весовые коэффициенты. Для выполнения второй части задания следует воспользоваться соответствующей операцией на векторном АЛУ. При этом не забывайте, что разбиение на элементы при использовании векторного АЛУ одинаково для входов Х и Y и задаётся регистром nb (см. разобранный пример для 11 варианта). Ответьте на вопрос – влияет ли разбиение на результат вашей операции на векторном АЛУ?

Вариант 5. Поменять местами соседние четные и нечетные 16-разрядные элементы. Затем найти результат логического «и» 0-го и 1-го 64-разрядных слов и записать его сразу за концом блока.

Вариант 6. Найти сумму всех четных 32-разрядных элементов. Затем обнулить у всех 32-разрядных элементов блока биты, которые в полученной сумме равны нулю.

Вариант 7. Проинвертировать побитно блок памяти, а затем найти результат логического «и» исходного и проинвертированного блока.

Вариант 8. Заменить все неотрицательные 4-разрядные элементы нулём, а отрицательные – минус единицей. Затем заменить все -1 на 1, а нулевые элементы оставить без изменений.

Вариант 9. Выполнить арифметическую активацию всех 4-разрядных элементов порогами [-4; 3] (см. предыдущую работу). Затем найти результат «исключающего или» 0-го и 7-го (последнего) 64-разрядных элементов и записать его сразу за концом блока.

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

Вариант 10. Переставить в каждом 64-разрядном элементе 4-разрядные тетрады в обратном порядке, после чего проинвертировать побитно весь блок памяти.

Вариант 11. Прибавить всем четным 16-разрядным элементам следующий за ними нечетный элемент, умноженный на 2 и уменьшенный на 1, после чего вычислить результат операции «исключающего или» над 0-м и 4-м 16-разрядными элементами блока памяти, который записать в память 64-разрядным словом сразу за концом блока с обнулением оставшихся 48 старших бит слова. Затем найти сумму всех нечетных 8-разрядных элементов блока памяти в формате 32-разрядного слова.

3. Отладить по шагам полученную программу и убедиться в её правильности. Зафиксировать в отчете текст программы и результаты её работы.