Результат Главы 1. Обзор сборки — КиберПедия 

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Результат Главы 1. Обзор сборки

2023-02-03 23
Результат Главы 1. Обзор сборки 0.00 из 5.00 0 оценок
Заказать работу

 

Режимы адресации

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

Каждая пара ассемблерной мнемоники / режима адресации имеет свой собственный отдельный код операции, хотя вам не нужно запоминать каждый код операции, поскольку ассемблер обрабатывает это на основе формата операнда.

Ниже приведен один пример каждого режима адресации с использованием единственной мнемоники сборки в каждом случае. Все доступные комбинации см. В справочной главе 6502.

1. Режим немедленной или непосредственной адресации ( i mmediate) используется, когда вам нужно жестко запрограммированное значение в качестве операнда для инструкции. Значение кодируется внутри самой инструкции, и, следовательно, инструкции не требуется адрес памяти в качестве операнда.

Например, «LDA # 2» - это 2-байтовая инструкция, 1 байт для кода операции «$ A9» (версия lda для непосредственного режима) и 1 байт для значения «2».

 

 

В CBM prg Studio символ «#» сообщает ассемблеру, что следующее число должно использоваться в немедленном режиме и, следовательно, не относится к адресу памяти. Номер может быть представлен в двоичном виде (с использованием префикса «%»), десятичном (без префикса) или шестнадцатеричном (с использованием префикса «$») виде.

Чтобы было ясно, "#" и префикс номера - разные вещи и не связаны между собой. Значек «#» определяет значение или адрес памяти, а префикс определяет основание числа.

ВНИМАНИЕ! "#" означает значение, иначе это адрес памяти.

2. Режим абсолютной адресации ( a bsolute) используется для доступа к 1 байту данных с использованием 2-байтового (16-битного) адреса памяти. Использование 16-битного адреса памяти позволяет ссылаться на все 65 536 (64 КБ) ячеек памяти в Commodore 64, поскольку 16-битное число может хранить значения от 0-> 65535.

Например, «LDA $ 1234» - это 3-байтовая инструкция, 1 байт для кода операции «$ AD» (версия LDA в абсолютном режиме), 1 байт для байта младшего адреса «$ 34» и 1 байт для байта старшего адреса «$ 12». Помните, что поскольку 6510 является с обратным порядком байтов, байты адреса памяти сохраняются в младшем, а затем в старшем байтах.

 

 

3. Режим адресации нулевой страницы ( zero page) используется для доступа к 1 байту данных с использованием 1 байтового (8-битного) адреса памяти. Поскольку один байт может хранить только значения от 0-> 255, этот режим используется исключительно с первыми 256 байтами памяти, известной как нулевая страница. Инструкции, ссылающиеся на нулевую страницу, выполняются быстрее и используют меньше памяти, чем их аналоги с абсолютной адресацией.

 

 

4. Режим подразумеваемой адресации ( i mplied) используется для инструкций, не требующих операнда. Обычно они работают со встроенными регистрами 6510. Например, «INX» - это 1-байтовая инструкция, состоящая только из кода операции.

 

 

5. Косвенный режим абсолютной адресации (indirect absolute) используется только для специального случая инструкции «JMP». Обычный JMP использует режим абсолютной адресации и имеет 2-байтовый (16-битный) адрес памяти для перехода к выполнению кода.

Эта косвенная абсолютная версия извлекает 1 байт из памяти по указанному 16-битному адресу, а также байт сразу после этого в памяти. Он использует значение первого байта в качестве младшего адреса, а значение второго байта - в качестве старшего адреса (с прямым порядком байтов), а затем перескакивает для выполнение кода в эту ячейку памяти. Так что эффективно, это переход через справочную таблицу.

 

 

6. Абсолютно индексированный режим X-адресации ( a bsolute i ndexed, X) используется для доступа к 1 байту данных с использованием 2-байтового (16-битного) адреса памяти, аналогичного режиму абсолютной адресации, за исключением того, что перед выборкой данных значение, содержащееся в регистре X, добавляется в 16-битный адрес памяти.

Например, «LDA $ 1234, X», где значение в X равно 3, эквивалентно инструкции режима абсолютной адресации «lda $ 1237».

Это полезно для циклов кода и может использоваться таким же образом, как «цикл for» в языке более высокого уровня.

 

 

7. Абсолютное индексирование, режим адресации Y (absolute indexed, Y) такой же, как и предыдущий режим адресации, за исключением того, что значение в регистре Y используется для смещения адреса памяти.

 

 

8. Индексированная нулевая страница, режим X-адресации (zero page indexed, X) используется для доступа к 1 байту данных с использованием 1-байтового (8-битного) адреса памяти и представляет собой нечто среднее между режимом адресации нулевой страницы и режимом абсолютной индексированной адресации. Значение в регистре X добавляется к 8-битному адресу памяти перед выборкой данных, но исходный адрес памяти ограничен нулевой страницей. Следовательно, он имеет преимущества нулевой оптимизации страницы.

 


9. Индексирование нулевой страницы, режим адресации Y (zero page indexed, Y) такой же, как и предыдущий режим адресации, за исключением того, что значение в регистре Y используется для смещения адреса памяти. Он также ограничен инструкциями «LDX» и «STX».


 

10. Индексированный режим косвенной адресации (indexed indirect) используется для доступа к 1 байту данных с использованием 2-байтового (16-битного) адреса памяти. Требуется 1 байтовый (8-битный) адрес памяти (следовательно, на нулевой странице), но перед выборкой данных значение, содержащееся в регистре X, добавляется к 8-битному адресу памяти. Затем данные в этом адресе памяти, а также байт сразу после этого в памяти используются в качестве окончательного 16-битного адреса памяти.

Например, «LDA ($ 12, X)», где значение в X равно 5, даст адрес «$ 17». Если «$ 17» и «$ 18» содержат «$ 51» и «$ A0», то последний 1 байт данных будет извлечен из адреса памяти «$ A051».

 

 

ВНИМАНИЕ! Индексированные косвенные и косвенные индексации немного отличаются.


11. Режим косвенной индексированной адресации ( i ndirect i ndexed) аналогичен предыдущему режиму адресации, за исключением того, что регистр Y используется для смещения адреса памяти, а смещение применяется после того, как выбраны 2 байта для 16-битного адреса памяти, а не раньше.

Например, «LDA ($ 12), Y», где значение в Y равно 5, сначала построит 16-битный адрес памяти из значений, содержащихся в «$ 12» и «$ 13». Если они содержат данные «$ 22» и «$ 91», то последний 1 байт данных будет извлечен из адреса памяти «$ 9122» + 5 = «$ 9127».

 

 

12. Режим относительной адресации (relative) используется для инструкций ветвления 6510 для перехода выполнения кода к заданному смещению от текущего местоположения счетчика программ на заданное значение смещения. Значение смещения - это число со знаком от -128 до +127 (верхний бит указывает положительное или отрицательное значение). Следовательно, эти инструкции ветвления могут перескакивать только на ограниченное количество байтов, и CBM prg Studio выдаст ошибку сборки, если смещение выходит за пределы допустимого диапазона.


 

13. Режим адресации аккумулятора (accumulator) аналогичен режиму подразумеваемой адресации, за исключением того, что инструкция работает только с регистром аккумулятора (A).

Например. «ASL» - это 1-байтовая инструкция, которая работает с аккумулятором.


 

Переключитесь на файл Addressing Modes.asm.

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

Это константы, переменные и метки.

Константы - это способ назвать значение или адрес памяти, который можно использовать во всем коде. Они объявляются с помощью директивы «=». В качестве первого прохода ассемблер просматривает весь код и заменяет все вхождения имени константы связанным с ней значением. Следовательно, сами константы в программу не входят и не используют память.

По соглашению, в этой книге первая буква каждой константы пишется с заглавной буквы, а для констант, указывающих на аппаратные регистры, все слово делается с заглавной буквы. Значения могут быть указаны в двоичном (префикс %), десятичном (без префикса) или шестнадцатеричном (префикс $) виде.

 

Addressing Modes.asm

#region Constants

Black                 = $00
White               = $01
Red                   = $02
Cyan                 = $03
Purple              = $04
Green              = $05
Blue                  = $06
Yellow              = $07
Orange            = $08
Brown              = $09
LightRed         = $0A
DarkGray        = $0B
MediumGray = $0C
LightGreen    = $0D
LightBlue        = $0E
LightGray        = $0F

BGCOL0           = $D021 ; VIC-II Background Color

#endregion

 

Переменные используются как способ присвоения имен и резервирования ячеек памяти для использования в программе. Они зарезервированы с помощью директивы "byte" и имеют начальное значение по умолчанию. Следует проявлять осторожность, чтобы не объявлять переменную непосредственно в пути исполняемого кода, поскольку значения в них будут интерпретироваться как инструкции, вызывающие непредусмотренное поведение программы. Этот код объявляет их после инструкции «RTS» и, следовательно, никогда не будет достигнут путем выполнения кода.

 

Addressing Modes.asm

#region Variables

myVariable byte 0,0 ; 2 bytes reserved

#endregion

 

ВНИМАНИЕ! Не объявляйте переменные в пути выполнения кода.

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

 

Addressing Modes.asm

#region Main
          
           LDA #White              ; 1. Immediate
           STA BGCOL0             ; 2. Absolute
           STA $FB                      ; 3. Zero Page
           TAY                              ; 4. Implied
           JMP (lut1)                      ; 5. Indirect Absolute
jumpToHere1                         ; label
           LDA lut2,x                       ; 6. Absolute Indexed, X
           STA myVariable,y        ; 7. Absolute Indexed, Y
jumpToHere2                               ; label
           LDA $FB,x                       ; 8. Zero Page Indexed, X
           STX $FA,y                       ; 9. Zero Page Indexed, Y
           LDA ($FC,x)                    ; 10. Indexed Indirect
          
LDA ($FC),y                    ; 11. Indirect Indexed
           BEQ jumpToHere2      ; 12. Relative
           ASL                                    ; 13. Accumulator
           RTS                                    ; return to BASIC

#endregion

 

Этот код является надуманным, поскольку его цель - продемонстрировать функциональность адресации памяти каждой инструкции, поэтому его результаты не особенно полезны.

• Выберите Debugger-> Debug Program (или F8), чтобы скомпилировать программу в машинный код и открыть инструмент отладчика.

• Выберите Registers->Set и измените значение программного счетчика (Program Counter) с 0801 на 080D.


• Выберите Debug-> Step Program, и значение регистра AC (аккумулятора) изменится на 01. Команда режима немедленной адресации «LDA» непосредственно загрузила значение $ 01 в аккумулятор. Обратите внимание, что константа «White» была заменена на $ 01 и это 2-байтовая инструкция. LDA # $ 01 - это ассемблерный код, который собирается в код инструкции (или машинный код) A9 01.

• Выберите Memory-> View…, чтобы открыть окно памяти и установить адрес $ D021.

• Выберите Debug-> Step Program, и значение памяти в $ D021 изменится на 01. Команда режима абсолютной адресации «STA» скопировала значение $ 01 из аккумулятора в 16-битный адрес памяти $ D021. Это 3-байтовая инструкция (AD 21 D0).

 


• Измените адрес в окне средства просмотра памяти на $ FB.

• Выберите Debug-> Step Program, и значение памяти в $ FB изменится на 01. Команда режима адресации нулевой страницы «STA» скопировала значение $ 01 из аккумулятора в 8-битный адрес памяти $ FB. Это 2-байтовая инструкция (85 FB).


 

• Выберите Debug-> Step Program, и значение регистра YR изменится на 01. Команда подразумеваемого режима адресации «TAY» скопировала значение $ 01 из аккумулятора в регистр Y. Это 1-байтовая инструкция (A8).



• Выберите Debug-> Step Program, и выполнение перейдет к следующей строке кода. Команда режима косвенной абсолютной адресации «JMP» считывает байт данных по 16-битному адресу памяти $ 082D (который был предоставлен ассемблером для метки «lut1»). Затем он взял этот байт и следующий за ним и выполнение кода перескочило на 16-битный адрес памяти $ 0818. Это 3-байтовая инструкция (6C 2D 08).

Чтобы сохранить младший и старший байтовый адрес памяти метки «jumpToHere1», директива CBM prg Studio «<» используется для получения младшего байта ($ 18) и «>» для получения старшего байта ($ 08).

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

 

Addressing Modes.asm

#region Lookup Tables

; Variables for the look up tables
lut1
           byte <jumpToHere1 ; low byte of address
           byte >jumpToHere1 ; high byte of address

lut2
           byte Green
           byte Purple
           byte Cyan

#endregion

 

• Выберите Debug-> Step Program, и значение регистра AC (аккумулятора) изменится на 05. Инструкция «LDA» режима адресации с абсолютным индексом "x" скопировала значение $ 05 (зеленый - green) из 16-битного адреса памяти $ 082F (который был предоставлен ассемблером для метки lut2). Это 3-байтовая инструкция (BD 2F 08).

В этом примере значение регистра X равно 00, поэтому смещение не применялось. Если бы значение регистра X было 01, были бы получены данные с адреса $ 0830, который равен $ 04 (фиолетовый - purple).


 

• Измените адрес в окне средства просмотра памяти (Memory Viewer) на $ 082A.

• Выберите Debug-> Step Program, и значение памяти в $ 082B изменится на 05. Инструкция sta в режиме абсолютной индексации y-адресации скопировала значение $ 05 из аккумулятора по адресу $ 082A (который был предоставлен ассемблером для метки myVariable) + 1 (значение в регистре Y), поэтому $ 082B. Это 3-байтовая инструкция (99 2A 08).

Обратите внимание на то, как байтовые значения для таблиц поиска находятся в средстве просмотра памяти, поскольку они были определены сразу после 2 байтов для «myVariable» в памяти.


 

• Измените адрес в окне средства просмотра памяти на $ FB.

• Выберите Debug-> Step Program, и значение регистра AC (аккумулятора) изменится на 01. Инструкция «LDA» с индексированной нулевой страницей, режим адресации x скопировала значение $ 01 из 8-битного адреса памяти $ FB в аккумулятор. Это 2-байтовая инструкция (B5 FB).

В этом примере значение регистра X равно 00, поэтому смещение не применялось. Если бы значение регистра X было 01, данные из адреса $ FC были бы извлечены и так далее.


 

• Измените адрес в окне средства просмотра памяти на $ FA.

• Выберите Debug-> Step Program, и значение памяти в $ FB изменится с 01 на 00. Инструкция «STX» с индексированной нулевой страницей, режим адресации y скопировала значение $ 00 из регистра x в 8-битный адрес памяти $ FB. Это 2-байтовая инструкция (96 FA).

В этом примере значение регистра Y равно 01, поэтому было применено смещение 1, изменяющее ячейку памяти $ FB вместо $ FA.


 

• Измените адрес в окне средства просмотра памяти на $ FC.

• Выберите Memory->Set… и установите для адреса $ FC значение $ 2E.

 


• Выберите Memory->Set… и установите для адреса $ FD значение $ 08.

 


Это демонстрирует, как устанавливать значения памяти непосредственно во время отладки. Мы используем эти значения в этом случае для тестирования режимов адресации памяти. В реальной программе эти значения необходимо предварительно установить в память.

16-битная ячейка памяти $ 082E теперь установлена в память (с прямым порядком байтов) для использования в следующем примере режима адресации. Это зеленый цвет (05) в lut2.

• Выберите Debug-> Step Program, и значение регистра AC (аккумулятора) изменится на 05. Инструкция «LDA» режима индексированной косвенной адресации взяла значение $ 2E из адреса $ FC и значение $ 08 из адреса $ FD, а затем скопировала значение из этого адреса $ 082E в аккумулятор. Это 2-байтовая инструкция (A1 FC).

В этом примере значение регистра X равно 00, поэтому смещение не применялось. Если бы значение регистра X было 01, адрес поиска был бы прочитан из $ FD и $ FE.

 

 

• Выберите Debug-> Step Program, и значение регистра (аккумулятора) AC изменится на 04. Команда режима косвенной индексированной адресации «LDA» взяла значение $ 2E из адреса $ FC и значение $ 08 из адреса $ FD, затем добавила 01 из регистра Y и скопировал значение с этого адреса $ 082F в аккумулятор. Это 2-байтовая инструкция (B1 FC).

В этом примере значение регистра Y равно 01, поэтому к адресу поиска было применено смещение 1.


 

• Выберите Debug-> Step Program, и выполнение перейдет к следующей строке кода. Команда режима относительной адресации «BEQ» проверяла флаг нуля процессора (подробнее об этом в следующем разделе) и, поскольку он не установлен в 1, она не перескакивала на метку «jumpToHere2». Это 2-байтовая инструкция (F0 F6).

F6 представляет собой -4 байта, что является количеством байтов, которое ветвь перешла бы, если бы флаг нуля процессора был установлен в 1.


 

• Выберите Debug-> Step Program, и значение регистра AC (аккумулятора) изменится на 08. Команда режима адресации аккумулятора «ASL» сдвинула биты в позиции аккумулятора 1 влево, что удвоило значение 4 до 8. Это 1 байтовая инструкция (0A).

 


Следующая инструкция в памяти - это «RTS», которая возвращает нас к BASIC и подводит нас к концу этой примерной программы режимов адресации.

• Закройте отладчик и выберите Build-> Program-> And Run (или F5) для запуска в эмуляторе VICE.

Попробуйте изменить цвета таблицы lut2.

 


Поделиться с друзьями:

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.065 с.