Среда, 18.10.2017, 19:34
БК-0010.01. Повесть о настоящем компьютере
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
Меню сайта
Категории каталога
Введение в руководство [2]
Введение [0]
Организация БК-0010 [1]
Раздел 1. Организация БК-0010
Работа с МСД [1]
Раздел 2. Работа с МСД
Системные регистры [1]
Раздел 3. Системные регистры
Системное ПО [1]
Раздел 4. Системное программное обеспечение БК-0010
Прерывания. Приоритет ЦП [1]
Раздел 5. Система прерываний БК-0010. Приоритет процессора
Командные прерывания [1]
Раздел 6. Командные прерывания
ЕМТ БК-0010 [1]
Раздел 7. командные прерывания ЕМТ БК-0010
Коды и ассемблер. Мнемокод. [1]
Раздел 8. Коды и ассемблер. Мнемокод. Формат команды
Способы адресации [1]
Раздел 9. Способы адресации
Команды процессора БК-0010 [1]
Раздел 10. Система команд процессора БК-0010
Псевдокоманды. Метки. Комментарии [1]
Раздел 11. Псевдокоманды ассемблера. Метки. Комментарии
Программирование на ассемблере [1]
Раздел 12. Программирование на ассемблере. Начало. Трансляция программ. Ошибки
Отладка программ [1]
Раздел 13. Отладка программ. Позиционно-независимое программирование. Компановка
Подпрограммы ПЗУ БК-0010 [1]
Раздел 14. Подпрограммы ПЗУ БК-0010
Системная область ОЗУ БК-0010 [1]
Раздел 15. Системная область ОЗУ БК-0010. Некоторые секретные сведения об авторе и МП-клубе
Повышение быстродействия БК-0010 [1]
Раздел 16. Вопросы повышения быстродействия БК-0010
Об использовании ПЗУ [1]
Раздел 17. Полезная подпрограмма. Об использовании ПЗУ
Загадочные регистры [1]
Раздел 18. Загадочные регистры
Штурм системной области [1]
Раздел 19. Продолжаем штурм системной области
Об автозапуске программ [1]
Раздел 20. Об автозапуске программ
Коварные программы [1]
Раздел 21. Коварные программы
Еще о системной области [1]
Раздел 22. О пользе плагиата, или еще о системной области
О псевдокомандах и компановке [1]
Раздел 23. Еще раз о псевдокомандах, метках и компановке
Тук-тук, кто в стеке живет? [1]
Раздел 24. Тук-тук, кто в стеке живет?
Фокал с позиций ассемблера [1]
Раздел 25. Взгляд на фокал с позиций ассемблера
Наш опрос
Оцените мой сайт
Всего ответов: 47
 Каталог статей
Главная » Статьи » Способы адресации

Способы адресации

Этот раздел является важнейшим разделом программирования на ассемблере, т.к. только знание способов адресации позволяет программисту задавать операнды. Способы адресации будут излагаться с учетом специфики используемого ассемблера микро8.
Наша терминология кое-где будет страдать некоторой вольностью, но иначе трудно сделать изложение хоть сколько-нибудь понятным. Способы (или методы) адресации одинаковы для всех команд, имеющих поле операндов. Для иллюстрации способов адресации нам придется сначала привести хотя бы несколько операторов.

Выберем самые простые: CLR  и MOV.
CLR n - одноадресная команда, присваивающая данному операнду значение 0 (очистка).
MOV m,n - двухадресная команда (пересылка). Она присваивает значение первого операнда второму, или, как принято говорить, пересылает содержимое 1-го операнда по адресу 2-го, причем первый при этом не меняется.

Команды мы будем условно заключать в скобки <...>, чтобы их выделить, но в тексте программы эти скобки не нужны.
Также придется отметить, что почти во всех командах возможны операции как с целыми словами, так и с полусловами (байтами). Написание оператора при этом сохраняется, но добавляется буква в, например: MOV и MOVB; CLR и CLRB, и т.п.

Регистровая адресация, или обращение к регистру.
Как уже говорилось, к регистру обращаются только по имени. В МИКРО8 это имена: R0, R1, R2, R3, R4, R5, SP и PC.
пример: <CLR R0> - очистить R0.

косвенно-регистровая адресация, или адресация через регистр.
при этом способе мы вначале должны занести в любой из регистров общего назначения физический адрес операнда, т.е. Номер ячейки памяти, в котором он расположен, а затем уже, пользуясь этим регистром, как указателем, обратиться через него к операнду.
пример: допустим, в R0 записано число 1000, а по адресу 1000 - число 3333. Тогда
<MOV @R0,R1> - записать число 3333 в R1,
а затем -
<MOV @R0,@R1> - записать число 3333 в ячейку 3333.
можно и так:
<MOV @R0,R0> - записать число 3333 в R0. Естественно, что после этого косвенное обращение через R0 к ячейке с адресом 1000 уже невозможно, т.К. В нем число 3333.
вместо обозначения косвенной адресации <@rn>, применяется также (rn), причем они совершенно равноправны.
в качестве 1-го примера можно записать:
<MOV (R0),R1>, смысл его от этого не изменится.

Автоинкрементная адресация через регистр.
это - прямой аналог предыдущего способа, с той лишь разницей, что содержимое регистра, через который мы адресуем операнд, не остается постоянным, а увеличивается после операции. Увеличение - на 2 для обычных команд и на 1 для команд байтовых. R> пример: пусть b R0 число 1000, а по адресу 1000 записано число 3333. Тогда после выполнения
<MOV (R0)+,R1> в R1 окажется число 3333, а в R0 - число 1002.
если же
<MOVb (R0)+,R1>, то в R1 - число 333 (мл. Байт по адресу 1000), а в R0 - 1001.
очевидно, что эту адресацию можно использовать для пересылки целых зон ОЗУ, например:
<MOV (R0)+,(R1)+>.
если до операции в R0 было, допустим, число 1000, а в R1 - число 3000, то, выполнив такую команду 3 раза, мы перепишем область памяти 1000...1006 В область 3000...3006.

Автодекрементная адресация через регистр.
это - точный аналог предыдущего случая, но содержимое регистра не увеличивается, а уменьшается, и не после операции, а до нее.
пример: пусть в R0 1002, а по адресу 1000 - 3333. Тогда после r> <MOV -(R0),R1> в R1 будет 3333, а в R0 - 1000.

Индексная, или адресация через регистр со смещением.
если мы перед обозначением регистра запишем число, то произойдет обращение не по адресу, заключенному в регистре, а по адресу со смещением на это число, причем число это при трансляции записывается, как второе слово команды.
пример: пусть в R0 1000, а по адресу 1020 - 3333.
тогда после
<MOV 20(R0),R1> в R1 запишется 3333.
возможна форма <-20(R0)>, при этом адрес исчисляется, как содержимое R0 минус 20.

Абсолютная адресация.
при этом вторым словом команды является число - абсолютный адрес.
пример:
<MOV @#163220,R0> - записать содержимое ячейки (ПЗУ) с номером 163220 в R0.

Непосредственная адресация. При этом по адресу 2-го операнда записывается число - 1-й операнд. Это число при трансляции записывается 2-м словом команды..
пример:
<MOV #200,R0> - записать число 200 в R0.
<MOV #200,(R0)> - записать 200 в ячейку, адрес которой задан в R0.
<MOV #200,@#324> - записать число 200 в ячейку с адресом 324 (системная область, длина файла на запись).

Относительная адресация.
близка к абсолютной, но вместо абсолютного адреса указывается относительный: смещение адреса относительно адреса 1-го слова следующей команды. Очевидно, что если текущая команда занимает 2 слова, то смещение от ее 1-го слова будет на 4 больше. Как можно видеть, этот способ адресации требует знаний о том, сколько слов занимает текущая команда, и какое "расстояние" от нее до нужного операнда. Зато он позволяет сохранить работоспособность программы при ее перемещении в ОЗУ, т.е. Когда абсолютные адреса изменяются.
в микро8 этот способ применяется автоматически при обращениях по меткам. Применение его "напрямую" в микро8 запрещено, да и было бы слишком сложно.
Пример: пусть метка M1 соответствует адресу 1020, а по этому адресу записано число 3333.
запишем:
<MOV M1,R0>.
В результате трансляции этой команды 2-м ее словом будет записано смещение, равное в нашем случае разности 1020 и адреса, по которому она находится, минус 4. Если наша команда находится по адресу 1000, то смещение будет: 1020-1000-4=14 (не забывайте, что мы оперируем только с восьмеричной системой счисления!).
Если адрес загрузки изменится, то смещение сохранится, и все равно команда будет записывать в R0 число, отстоящее на 20 байт от первого слова нашей команды.
что будет, если метка находится до команды? То же самое, только смещение станет отрицательным числом, выраженным в дополнительном коде. Проще всего сказать, что дополнительный код представляет из себя как бы смещение в прямом направлении "через край памяти" БК-0010, а все ее адресное пространство, как мы помним, занимает 200000 адресов (последний адрес 177777+1=200000).
Если, допустим, нам нужно смещение к метке по адресу 1000, а наша команда - по адресу 1002, то мы получим "до края памяти": 200000-1002-4=176772, а "через край" до адреса 1000 - еще +1000=177772 - это и есть смещение, или относительный адрес.
Что произойдет, если в первом примере мы впишем между нашей командой и меткой м1 еще команду в 2 слова? При трансляции смещение получится уже не 14, а 20 (14+4=20). Но результат не изменится: все равно в R0 будет записано после выполнения команды число, размещенное по метке М1.
Это похоже на обращение к переменной фокала: если мы знаем ее имя, то знать адрес, по которому она находится в памяти, нам не нужно.

Мы рассмотрели основные способы адресации, но возможна и их некая комбинация.

Например, косвенно-автоинкрементная адресация предполагает, что по адресу, заданному через регистр с инкрементом, находится не сам операнд, а адрес его нахождения.
Пример: пусть в R0 1000, по адресу 1000 - число 3333, а по адресу 3333 - число 4444.
В результате исполнения команды
<MOV @(R0)+,R1> в регистр R1 запишется число 4444, а содержимое R0 станет равно 1002.

Аналогично "работает" и косвенно-автодекрементная адресация, и косвенно-индексная, и косвенно-относительная - во всех этих случаях то, что было раньше операндом, становится его адресом, "настоящий" же операнд находится по этому адресу.
Эти способы адресации записываются следующим образом:
<MOV @-(R0),R1> - косвенно-автодекрементная;
<MOV @20(R0),R1> - косвенно-индексная;
<MOV @m1,R0> - косвенно-относительная.

Для чего такое разнообразие видов адресации? - Спросите вы. Очень просто: в разных случаях применение той или иной адресации более или менее эффективно. Начав писать программы на ассемблере, вы сами в этом убедитесь. Впрочем, далеко не все способы адресации имеют равное применение. Наиболее широко применяются способы, выделенные у нас, как основные, причем из них индексная - реже других. Автор не выводил по этому вопросу статистических показателей, но из своего опыта может указать, что способы адресации по убыванию частоты применения можно расположить:

  • регистровая;
  • непосредственная;
  • косвенно-регистровая;
  • автоинкрементная;
  • относительная;
  • абсолютная;
  • автодекрементная;
  • индексная.
Остальные способы применяются весьма редко. Впрочем, это в очень сильной степени зависит как от индивидуальных "вкусов" и привычек программиста, так и от вида создаваемой программы.

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

Категория: Способы адресации | Автор: ЗАЛЬЦМАН Ю.А., МП-КЛУБ, г.АЛМА-АТА
Просмотров: 3658 | Комментарии: 33 | Рейтинг: 0.0/0 |

Всего комментариев: 2
2  
San Jose Toledo Santa Ana Stockton Virginia Beach San Antonio New York Plano Oakland Seattle



To Joaquin family, I am very sorry for your loss... To Cameron,Sherman, my thoughts and prayers have been with you everyday... He loved and cherished the three of you!

January 22, 2017
Oakland
Tampa

https://www.youtube.com/watch?v=ZY-r-A58Er4 - Arnulfo,Merlin,Amos,Ervin,Cedric,Brain,Donovan,Fabian,Malcolm,Andres,Grady,Harlan ,Andres,Art,Freddy,Lamar,Odell,Winston,Jan,
Your friends Colin,Roderick,Quinton,Carey,Malcolm,Jamal,Chuck,Gilberto,Vern,Lucien,Fabian,Mitc hel,Santiago,Gerard,Garry,Guadalupe,Jacques,Lamar,Dante,Bernardo,Taylor,Hugo,Tere nce,Darrin,Willis,Homer,Carmine,Wm,Stuart,Guadalupe,Agustin,Lazaro,Ellis,Bert,Ray mundo,Damian,Brendan,Kendall,Levi,Conrad,Lucas,Mary,Vicente,Xavier,Jackson,Angelo ,Margarito,Grover,Darius,Spencer,Cyril,Bret,Roscoe,Morgan,Geoffrey,Thad,Avery,Elv is,Burt,Winfred,Genaro,Stuart,Wilford,Harris,Murray,Rusty,Damian,August,Dallas,De nis,Luke,Everette,Lowell,.

1  
http://vermoxbezreceptu.etowns.net - http://vermoxbezreceptu.etowns.net/vyprodej700.jpg
http://vermoxbezreceptu.etowns.net 20. leden 2014 ... Cyklocentrum J. Plisek, prodej a servis jizdnich kol, prislusenstvi a cyklistickeho obleceni. pdcuvuMustang; lsx ... Koupit KamagraВ® on-line bez lekarskeho predpisu v Czech...Ellis even ... Find out what happens when FB…1. kveten 2010 ... Uz v roce 1890 byl pouzit W. Jamesem termin Porucha pozornosti jako deficit ..... nizka cena a pomerne dlouhodobe zkusenosti v klinicke praxi. ... Atomoxetin (Strattera) je dostupny v Ceske republice od kvetna 2007 a je v ... http://vermoxbezreceptu.etowns.net - vermox

Имя *:
Email *:
Код *:
Используются технологии uCoz
Форма входа

Поиск
Друзья сайта
Статистика