Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Подпрограмму через общие регистры
Предполагается, что аргументы находились в ячейках памяти 8000 и 8050. Главная программа загружает их в общие регистры D и Е, после чего передает управление на подпрограмму в ячейке 9000 с помощью команды «переход на подпрограмму». Если нужные подпрограмме аргументы находятся в последовательных ячейках памяти, в главной программе перед переходом на подпрограмму можно загрузить в регистры Н и L (или в любую другую пару общих регистров) адрес первого аргумента. Ответственность за выборку аргументов возлагается при этом на подпрограмму. Достоинство этого способа в том, что не нужно загружать сразу все аргументы в регистры — программа будет выбирать из их памяти по мере необходимости. Такой подход, очевидно, предпочтительнее, когда число аргументов превышает число свободных общих регистров. Кроме того, этот подход решает проблему обратной передачи результатов. Например, достаточно под результаты зарезервировать часть списка аргументов. В рассмотренном случае главная программа загружала в регистры Н и L адрес первого аргумента и тем самым передавала в подпрограмму список аргументов. Возможен вариант, когда главная программа передает в подпрограмму не список самих аргументов, а список адресов аргументов. В этом случае в регистры Н и L загружается адрес первого адреса в списке адресов аргументов. Таким образом, чтобы получить аргумент, подпрограмма должна сначала получить адрес из списка адресов, а уже затем сам аргумент. Этот способ обладает тем преимуществом, что аргументы не обязательно должны располагаться в последовательных ячейках памяти, а могут быть разбросаны произвольным образом.
Сложение с п-кратной точностью
Большинство современных микрокомпьютеров работает со словами длиной 8 бит. Очевидно, что для многих задач такая точность недостаточна, и, следовательно, нужны средства для представления чисел с более высокой точностью. Очевидный способ — это представлять одно число двумя или большим количеством слов. Такие числа можно хранить в последовательных ячейках памяти или в последовательных общих регистрах. Будем называть их числами n - кратной точности. Проблема тогда сведется к выполнению арифметических действий над числами n -кратной точности с помощью команд, работающих с данными размером в одно слово. Наличие команд «сложения/вычитания с переносом» значительно упрощает реализацию сложения и вычитания над числами n-кратной точности. Процедуру сложения чисел без знаков с двойной точностью можно реализовать, например, следующим образом. Младшие слова двух чисел складываются без начального переноса, при этом получается младшее слово суммы и итоговый перенос из старшего разряда. Старшие слова двух чисел складываются вместе с входным переносом, который равен итоговому переносу, полученному при сложении младших слов. Окончательный результат, т. е. сумма,— это число с двойной точностью и итоговый перенос. В виде блок-схемы эта процедура представлена на рис. 18. В табл. 6 показана подпрограмма, реализующая эту процедуру. Исходные числа с двойной точностью обозначены через X и Y, а сумма — через S. Предполагается, что общие регистры 1 и 2 содержат соответственно старшую и младшую части X (обозначенные как Хн и XL), а регистры 3 и 4 — старшую и младшую части Y (обозначенные как yh и yl). Старшая и младшая части суммы должны быть помещены в регистры 5 и 6 соответственно. Таблица 5.6 Подпрограмма сложения чисел с двойной точностью Распределение общих регистров: R1:XH, R3:YH, R5:SH R2:XL, R4:YL, R6:SL
Рис. 5.3 Блок-схема алгоритма сложения чисел с двойной точностью
Первая команда загружает младшую часть X в аккумулятор. Затем команда сложения складывает младшие части X и Y без начального переноса. Итоговый перенос из старшего разряда устанавливается на триггер переноса С. Затем полученная на сумматоре младшая часть суммы передается в регистр 6. После этого старшая часть X передается в аккумулятор. Далее команда «сложение с переносом» складывает старшие части X и Y и перенос С. В результате старшая часть суммы оказывается в аккумуляторе, а окончательный перенос — в триггере переноса С. Старшая часть суммы передается в регистр 5 следующей командой. Последняя команда — возврат из подпрограммы. Умножение Вы конечно, обратили внимание на отсутствие команды умножения в системе команд нашего иллюстративного микропроцессора. Отсутствие умножения (так же как и других операций, более сложных, чем сложение и вычитание) типично для большинства микропроцессоров. Если нет отдельной команды для умножения, то можно, разумеется, написать подпрограмму, которая будет его выполнять, следуя одной из известных процедур. В частности, можно реализовать процедуру получения и сложения частных произведений, как это делается при умножении «в столбик». Рассмотрим умножение двух 8-битовых чисел без знаков. Вообще говоря, можно осуществить процедуру умножения, накапливая текущую частную сумму частных произведений, которые получаются последовательно, начиная с частного произведения, соответствующего младшему разряду множителя. Таким образом, каждое частное произведение прибавляется к частной сумме. После каждого сложения частная сумма сдвигается вправо, что соответствует выравниванию разрядов различных частных произведений. Каждое частное произведение равно либо множимому, если соответствующий разряд множителя равен 1, либо нулю, если разряд множителя равен 0. Сложив все 8 частных произведений и сдвинув результат, мы получим частную сумму, равную полному 16-разрядному произведению. Изложенная процедура показана на блок-схеме рис. 8.4. Символы X, Y, Рн и PL обозначают соответственно 8-битовые значения множителя, множимого, старших разрядов произведения (ст. часть) и младших разрядов произведения (мл. часть). Блок-схема представляет собой цикл. Она начинается с двух блоков инициализации цикла. Первый блок устанавливает старшую и младшую части произведения (в котором будет накапливаться частная сумма) равными нулю. Второй блок устанавливает значение 8 (соответствующее числу битов множителя) на счетчик, который будет считать число итераций в цикле. Следующий блок принадлежит самому циклу. В нем множитель X сдвигается вправо так, чтобы младший бит попал в триггер С для последующего тестирования. Фактически этот бит соответствует текущему анализируемому биту множителя, по которому определяется частное произведение для прибавления к частной сумме. В следующем блоке тестируется С. Если С=1, множимое прибавляется к частной сумме, а перенос из старшего разряда попадает в триггер С. В противном случае, когда С=0, сложение не производится, поскольку частное произведение равно 0. В любом случае следующий блок вызывает циклический сдвиг старшей части частной суммы Рн и переноса С вправо. При этом старшие разряды суммы циклически сдвигаются вправо; содержимое С, где до сдвига находится старший разряд частной суммы, попадает в старший разряд рн, а младший разряд Рн сохраняется в С. Затем следующий блок сдвигает младшие разряды частной суммы PL вправо, «вдвигая» в нее слева значение С. На этом рабочая часть очередной итерации заканчивается. Следующий блок вычитает 1 из счетчика циклов. Затем счетчик тестируется. Если он равен 0, процесс умножения заканчивается, в противном случае цикл повторяется. По рассмотренной блок-схеме нетрудно написать программу для микропроцессора. Фактически блок-схема и составлялась в расчете на наш микропроцессор; особенно это видно по действиям с триггером С. Большинство промышленных микропроцессоров работает с триггером переноса аналогичным образом, и поэтому для них описанная блок-схема программируется так же легко. В табл. 7 приведена подпрограмма умножения. Регистры распределены следующим образом: R2—счетчик итераций, R3—множимое Y, R4—множитель X, R5—старшая часть произведения рн, R6— младшая часть произведения PL. Первые три команды соответствуют двум первым блокам блок-схемы и осуществляют инициализацию цикла. Следующие
Рис. 5.4 Блок схема процедуры умножения
три команды переносят множитель X в аккумулятор из регистра 4, сдвигают его циклически вправо и результат возвращают в регистр 4. В результате очередной разряд множителя, определяющий частное произведение, оказывается на триггере переноса С. Затем для подготовки сложения и сдвигов старшая часть произведения рн переносится в аккумулятор. Показанное на блок-схеме тестирование С = 1 осуществляется командой «переход при ненулевом переносе». Она обеспечивает пропуск следующей команды при С=0. Эта следующая команда прибавляет множимое Y к аккумулятору (который содержит рн) и сохраняет перенос из старшего разряда в С. Затем Рн и С циклически сдвигаются вправо командой RTR. После сдвига новое значение рн возвращается в регистр 5. Затем в соответствии со следующим блоком схемы pl и С сдвигаются вправо, для чего с помощью трех команд pl из регистра 6 загружается в аккумулятор, циклически сдвигается вместе с С и результат возвращается в регистр 6. После этого счетчик в регистре 2 уменьшается на 1 командой DHL, результат передается в аккумулятор и тестируется командой «переход при ненулевом аккумуляторе». Если аккумулятор содержит 0, то выполняется выход из подпрограммы; в противном случае управление передается на начало цикла.
Загрузка программ Важную роль в компьютерах играют средства загрузки исполняемых программ в память машины. Во многих приложениях, где микропроцессоры выполняют лишь какие-то раз и навсегда установленные функции, программы хранятся в постоянной памяти. Однако в приложениях, требующих большей гибкости и разнообразия, программы загружаются в оперативную память по мере необходимости. Обычно это делает специальная программа-загрузчик, которая выполняет операции по вводу требуемой программы с некоторого устройства ввода и размещению ее в памяти.
Таблица 5.7 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2018-04-12; просмотров: 277. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |