movia r17, 0x01234567

stwio r17, 0(r16)

add zero, zero, zero

ldwio r18, 0(r15)

bne r17, r18, RET_ERROR

movi r2, 1

br RETURN

RET_ERROR:

movi r2, 0

RETURN:

ldw ra, 0(sp)

ldw fp, 4(sp)

ldw r15, 8(sp)

ldw r16, 12(sp)

ldw r17, 16(sp)

ldw r18, 20(sp)

addi sp, sp, 24

ret

/****************************** DATA SECTION *********************************/

.data

.global DISPLAY_BUFFER

DISPLAY_BUFFER:

.fill 3, 4, 0

.global SHIFT_DIRECTION

SHIFT_DIRECTION:

.word 0

/* Таблица декодирования семисегментных индикаторов содержит значения включен(1)/выключен(0) для каждого сегмента индикаторов*/

SEVEN_SEG_DECODE_TABLE:

.byte 0b00000000, 0b00000110, 0b01011011, 0b01001111

.byte 0b01100110, 0b01101101, 0b01111100, 0b01010000

.byte 0b01011100, 0b01100111, 0b01110111, 0b01110011

.byte 0b00111001, 0b01011110, 0b01111001, 0b01110001

HEX3_HEX0:

.word 0

HEX7_HEX4:

.word 0

.global GREEN_LED_PATTERN

GREEN_LED_PATTERN:

.word 0

.global EIGHT_SEC

EIGHT_SEC:

.word 0

DISPLAY_TOGGLE:

.word 0

.end

---

Листинг 2 Исходный файл программы lab1_part3_DE.s

---

/* Программа осуществляет поиск максимального числа в списке целых чисел. */

.equ LIST, 0x500 /* Адрес начала списка в памяти. Первый элемент списка будет содержать максимальное число, 2-ой - количество чисел в списке*/

.global _start

_start:

movia r4, LIST /* В регистр R4 записывается адрес начала списка */

ldw r5, 4(r4) /* Считываем в регистр R5 значение количества чисел в списке */

addi r6, r4, 8 /* Вычисляем адрес памяти, с которого начинают располагаться числа для поиска*/

НЕ нашли? Не то? Что вы ищете?

ldw r7, (r6) /* В регистр R7 из памяти по адресу R6 считывается первое число списка */

LOOP:

subi r5, r5, 1 /* Уменьшаем значение количества чисел в списке */

beq r5, r0, DONE /* Если значение регистра R5 равно 0, то выходим из цикла */

addi r6, r6, 4 /*Увеличиваем адрес памяти на 4 (переходим к следующему числу */

ldw r8, (r6) /* Считываем из памяти следующее число */

bge r7, r8, LOOP /* Если текущее максимальное число больше или равно считанному, то возвращаемся в начало цикла*/

add r7, r8, r0 /* Иначе, записываем в R7 новое максимальное число */

br LOOP

DONE:

stw r7, (r4) /* Записываем максимальное число в память по адресу 0x500 */

STOP:

br STOP /* Бесконечный цикл */

.org 0x100

RESULT:

.skip 4 /* Выделяем 4 байта для хранения максимального числа */

N:

.word 7 /* Количество чисел в списке */

NUMBERS:

.word 4, 5, 3, 6, 1, 8, 2 /* Числа из списка */

.end

---

Листинг 3 Исходный файл программы LCD_DE2_70.s

---

.include "nios_macros. s"

.text

.equ lcd,0x10003050 /*Адрес регистра lcd*/

.equ clear,0x00000001 /*Код команды очистки экрана lcd*/

.equ set1,0b10000000 /*Код команды установки курсора в первую позицию первой строки*/

.equ set2,0b11000000 /*Код команды установки курсора в начало 2 строки*/

.equ off,0b00001100 /*Код команды выключения курсора*/

.equ right,0b00011100 /*Код команды сдвига экрана вправо*/

.equ left,0b00011000 /*Код команды сдвига курсора влево*/

.global _start

_start:

movia r2,lcd

movi r3,clear /*Код команды очистки lcd*/

stbio r3,0(r2) /*Очищаем экран lcd*/

movi r3,set1

stbio r3,0(r2) /*Устанавливаем курсор в начало первой строки*/

movia r4,String1 /*В регистр R4 записываем адрес первой строки*/

cikl:

ldb r5,0(r4) /*Считываем символ из строки и помещаем его в R5*/

beq r5,zero, met /*Если считанныцй символ равен 0, то выходим из цикла*/

stbio r5,1(r2) /*Записываем из R5 в регистр данных lcd*/

addi r4,r4,1 /*Инкрементируем адрес символа строки*/

br cikl

met:

movi r3,set2

stbio r3,0(r2) /*Устанавливаем курсор в начало второй строки*/

movia r4,String2 /*Выводим вторую строку*/

cikl2:

ldb r5,0(r4)

beq r5,zero, met1

stbio r5,1(r2)

addi r4,r4,1

br cikl2

met1:

movi r3,off

stbio r3,0(r2) /*Выключаем курсор*/

met2:

movi r3,right

stbio r3,0(r2) /*Сдвигаем экран вправо*/

br met2

met3:

movi r3,left

stbio r3,0(r2) /*Сдвигаем экран влево*/

br met3

.data /*Определяем сегмент данных*/

String1:

.asciz "Kreitin konec"

String2:

.asciz "Alexander"

.end

Таблица 2 ASCII - коды символов

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

Использование стека, подпрограмм и вложенных процедур

Цель работы: Использование подпрограмм и способов передачи им параметров, использование файлов с исходными данными, и с кодами программ в процессорной системе.

В лабораторной работе используется предварительно созданная процессорная система, особенности которой были изучены в предыдущей лабораторной работе.

Исходные файлы лабораторной работы

Исходным является файл lab1_part3_DE.s. Он содержит программу нахождения наибольшего числа из списка, которая использовалась в первой работе.

Подготовка к лабораторной работе

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

2.  Ознакомьтесь с системой команд процессора NIOS II [5,8], уясните, как происходит выполнение команд вызова процедур call, callr; работа со стеком; регистры, используемые для этого. Поместите в отчет, включая форматы вышеуказанных команд.

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

4.  Прочитайте описание приложения Altera Monitor Program (АМР) [6]. Уясните, как заполнить память процессорной системы и как выполнить загрузку файлов с исходными данными и с выполнимыми кодами программ в оперативную память процессорной системы. Поместите эти материалы в отчет.

5.  Уясните пункты задания, выполняемого в текущей лабораторной работе.

6.  Подготовьте файл с исходными данными для выполнения пункта 1 части 4.

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

8.  Уясните индивидуальное задание. Подготовьте программу для его выполнения.

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

Часть 1. Передача параметров через регистры

Используйте программу нахождения наибольшего числа в списке, которая выполнялась в 1 лабораторной работе.

1.  Запустите Altera Monitor Program. Откройте проект, созданный в 1 лабораторной работе. Выполните программу нахождения наибольшего числа из списка. Она содержится в файле lab1_part3 из папки «Исходные файлы к лабораторным работам». Убедитесь в работоспособности программы, меняя исходные числа во вкладке Memory AMP и наблюдая полученный результат.

2.  Модифицируйте программу таким образом, чтобы она была оформлена как подпрограмма с именем Max. Список обрабатываемых чисел разместите в основной программе сразу же после последней команды. Для передачи параметров подпрограмме используйте регистры R5, для указания числа слов в списке, и регистр R6, для указания начального адреса списка. Подпрограмма будет осуществлять анализ содержимого ячеек памяти, и находить наибольшее число. Подпрограмма должна завершаться командой ret. Результат формируется в регистре R7.

3.  В основной программе заполняются регистры R5 и R6 для передачи параметров, и осуществляется вызов подпрограммы с использованием команды call. Затем она выводит найденное число на светодиоды. Проверьте правильность работы программы, визуально наблюдая содержимое анализируемой области памяти, используя вкладку Memory, содержимое регистра R7 в регистровом окне приложения AMP и младшую часть результата, отображенную на светодиодах.

4.  Выполните предыдущий пункт, используя команду callr.

Часть 2. Передача параметров через стек

1.  Модифицируйте программу таким образом, чтобы передача параметров осуществлялась через стек. Для этого в основной программе определите в качестве вершины стека адрес последнего слова используемой в процессорной системе оперативной памяти. В качестве указателя стека используется регистр sp процессора. Обратите внимание на то, что после помещения в стек или извлечения из стека автоматического изменения регистра sp не происходит. Это должна выполнить Ваша программа. После записи в стек sp следует уменьшить на 4, перед извлечением из стека – увеличить на 4. Возврат найденного большего числа из списка также должен осуществляться через стек. Причем, результат может быть помещен в то место в стеке, где были размещены передаваемые процедуре параметры. Для этого используйте соответствующее смещение относительно текущего указателя стека. Общепринятый прием – сохранение содержимого регистров, используемых в подпрограмме, в стеке в начале работы подпрограммы и восстановление их при завершении подпрограммы. Непосредственно перед выполнением команды ret, выполните коррекцию указателя стека так, чтобы он указывал на возвращаемый результат. Отладьте программу, убедитесь в ее работоспособности, покажите результат преподавателю.

2.  Запускайте программу, изменяя исходные данные. Для заполнения памяти используйте соответствующее окно AMP.

Часть 3. Использование вложенных процедур

1.  Модифицируйте программу из предыдущей части следующим образом. Оформите вывод на светодиоды в качестве самостоятельной процедуры, передав в качестве параметра отображаемое число через какой-либо регистр процессора. Выполните вызов этой процедуры внутри подпрограммы Max. Из основной программы соответствующую часть кода удалите.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11

Основные порталы (построено редакторами)

Домашний очаг

ДомДачаСадоводствоДетиАктивность ребенкаИгрыКрасотаЖенщины(Беременность)СемьяХобби
Здоровье: • АнатомияБолезниВредные привычкиДиагностикаНародная медицинаПервая помощьПитаниеФармацевтика
История: СССРИстория РоссииРоссийская Империя
Окружающий мир: Животный мирДомашние животныеНасекомыеРастенияПриродаКатаклизмыКосмосКлиматСтихийные бедствия

Справочная информация

ДокументыЗаконыИзвещенияУтверждения документовДоговораЗапросы предложенийТехнические заданияПланы развитияДокументоведениеАналитикаМероприятияКонкурсыИтогиАдминистрации городовПриказыКонтрактыВыполнение работПротоколы рассмотрения заявокАукционыПроектыПротоколыБюджетные организации
МуниципалитетыРайоныОбразованияПрограммы
Отчеты: • по упоминаниямДокументная базаЦенные бумаги
Положения: • Финансовые документы
Постановления: • Рубрикатор по темамФинансыгорода Российской Федерациирегионыпо точным датам
Регламенты
Термины: • Научная терминологияФинансоваяЭкономическая
Время: • Даты2015 год2016 год
Документы в финансовой сферев инвестиционнойФинансовые документы - программы

Техника

АвиацияАвтоВычислительная техникаОборудование(Электрооборудование)РадиоТехнологии(Аудио-видео)(Компьютеры)

Общество

БезопасностьГражданские права и свободыИскусство(Музыка)Культура(Этика)Мировые именаПолитика(Геополитика)(Идеологические конфликты)ВластьЗаговоры и переворотыГражданская позицияМиграцияРелигии и верования(Конфессии)ХристианствоМифологияРазвлеченияМасс МедиаСпорт (Боевые искусства)ТранспортТуризм
Войны и конфликты: АрмияВоенная техникаЗвания и награды

Образование и наука

Наука: Контрольные работыНаучно-технический прогрессПедагогикаРабочие программыФакультетыМетодические рекомендацииШколаПрофессиональное образованиеМотивация учащихся
Предметы: БиологияГеографияГеологияИсторияЛитератураЛитературные жанрыЛитературные героиМатематикаМедицинаМузыкаПравоЖилищное правоЗемельное правоУголовное правоКодексыПсихология (Логика) • Русский языкСоциологияФизикаФилологияФилософияХимияЮриспруденция

Мир

Регионы: АзияАмерикаАфрикаЕвропаПрибалтикаЕвропейская политикаОкеанияГорода мира
Россия: • МоскваКавказ
Регионы РоссииПрограммы регионовЭкономика

Бизнес и финансы

Бизнес: • БанкиБогатство и благосостояниеКоррупция(Преступность)МаркетингМенеджментИнвестицииЦенные бумаги: • УправлениеОткрытые акционерные обществаПроектыДокументыЦенные бумаги - контрольЦенные бумаги - оценкиОблигацииДолгиВалютаНедвижимость(Аренда)ПрофессииРаботаТорговляУслугиФинансыСтрахованиеБюджетФинансовые услугиКредитыКомпанииГосударственные предприятияЭкономикаМакроэкономикаМикроэкономикаНалогиАудит
Промышленность: • МеталлургияНефтьСельское хозяйствоЭнергетика
СтроительствоАрхитектураИнтерьерПолы и перекрытияПроцесс строительстваСтроительные материалыТеплоизоляцияЭкстерьерОрганизация и управление производством