Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Подпрограмму через общие регистры




Ячейка памяти Команда на машин ном язык Команда в символической форме Комментарий

. . . . . .   .  . .

0020 70 LDR 0 Загрузка первого аргумента в регистр D
0021 80 80  
0022 00 00  
0023 0D MOV 0 to D  
0024 70 LDR 0 Загрузка второго аргумента в регистр Е
0025 80 80  
0026 50 50  
0027 MOV 0 to E  
0028 7F JMS Переход на подпрограмму в ячейке 9000
0029 90 90  
002А 00 00  
002В Точка возврата из подпрограммы.

.     . . . . .   .  . .

 

Предполага­ется, что аргументы находились в ячейках памяти 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

Ячейка памяти Команда на машин­ном языке Команда в символи­ческой форме Комментарий
0000 12 MOV 0 from 2 Загрузка XL в аккумулятор
0001 84 ADD 4 Сложение YL с XL, С = перенос
0002 06 MOV 0 to 6 Загрузка SL в регистр 6
0003 11 MOV 0 from 1 Загрузка Хн в аккумулятор
0004 93 ADC 3 Сложение Хн, Ун и С
0005 05 MOV 0 to 5 Загрузка SH в регистр 5
0006 F8 RET Возврат из подпрограммы

 

 

Рис. 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 не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...