Максимальный адрес ячейки памяти к которому может обратиться процессор зависит от

Обновлено: 07.07.2024

Перед изучением команд и регистров процессора 8086, очень важно понять, как он получает доступ к оперативной памяти, чтобы записывать в нее значения и читать их от туда.
Почему именно процессор 8086? Просто потому, что режим совместимости с командами этого процессора есть во всех старших моделях. И начинать изучать язык ассемблера проще с этого процессора.
Процессор 8086, мог работать только в одном режиме адресации памяти. Все следующие модели, начиная с процессора 80286, сохранили режим совместимости с 8086. Этот режим получил название реального режима ( Real Address Mode ), или R-режима.

Итак, ближе к делу.

Но постойте! Два 16-разрядных регистра дают 32 разряда. Как же из этого получается 20 битный адрес? Давайте разбираться где тут собака порылась.

Для определения начала сегментов памяти процессор 8086 использует четыре 16-битных сегментных регистра (CS, DS, SS, ES). Смещение внутри сегмента выбирается из регистров-указателей SP, BP, SI, DI или регистра IP (указателя команд - Instructions Pointer). Для получения 20-битного физического адреса, процессор размещает на адресной шине значение сегментного регистра и сдвигает его влево на четыре бита, заполняя младшие четыре бита адресной шины нулями (умножение на десятичное 16 или шестнадцатеричное 10 ), затем к этому значению прибавляется смещение и адрес сформирован.

Исходя из этого получается что границы сегментов (16-битное значение + 4 нулевых бита ) располагаются через каждые 16 байт физических адресов. 4 битами можно адресовать 16 (байт) ячеек памяти, каждая из которых как мы помним содержит один байт . Каждый из этих 16-байтовых фрагментов называется параграфом . 16-разрядные сегментные регистры могут адресовать 65536 (2 16 ) параграфов (границ сегментов). А параграф, как уже говорилось, это 16 байт. 65536(параграфов) умножаем 16(байт) получаем 1048576 байт или округленно 1 Мбайт. Хотя и тут не все гладко :). Здесь порылась вторая собака. Откапывать ее будет чуть позже.

Ниже приведен вывод регистров и сегмента кода в программе debug.exe, чтобы можно было все это наглядно увидеть.

-r
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=13DF ES=13DF SS=13DF CS=13DF IP=0100 NV UP EI PL NZ NA PO NC
13DF:0100 0000 ADD [BX+SI],AL DS:0000=CD
-d cs:100
13DF:0100 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 .
13DF:0110 00 00 00 00 00 00 00 00-00 00 00 00 34 00 CE 13 . 4.

Например, в сегментном регистре (CS -выделен ярким желтым цветом) хранится значение 13DFh, при умножении его на 10h получаем 13DF0h. Стоит обратить внимание, что младшая шестнадцатеричная цифра в адресе каждого сегмента всегда равна 0. То есть адрес любого сегмента всегда кратен 16 десятичному (10h). Поскольку последняя цифра в адресе сегмента всегда равна 0, то ее можно не хранить. В действительности 8086 вместо умножения на 16 использовал содержимое регистра так, как если бы оно имело четыре дополнительных нулевых бита (см. картинку).

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

Факты о "свинье":
* Нет никаких препятствий для обращения к физически не существующей памяти.
* При обращении к несуществующей памяти результат непредсказуем (все зависит от разработчика материнской платы и другого аппаратного обеспечения компьютера).
* Программа может обращаться к любому сегменту как для считывания, так и для записи данных и команд.

Содержание

Типы адресов памяти

Физические адреса

Память цифрового компьютера (или основная память) состоит из множества ячеек памяти, каждая из которых имеет физический адрес. [Источник 1] - код, который центральный процессор (или другое устройство) может использовать для доступа к ней. Как правило, только системное программное обеспечение, то есть BIOS [Источник 2] , операционные системы, и некоторые специализированные вспомогательные программы (например, тестеры памяти), обращаются к физической памяти с использованием операторов машинного кода и регистров процессора, Инструктируя CPU направлять аппаратное устройство, называемое контроллером памяти, использовать шину памяти или системную шину или отдельные управляющие, адресные и информационные шины для выполнения команд программы. Шина контроллеров памяти состоит из нескольких параллельных линий, каждая из которых представлена двоичной цифрой (бит). Ширина шины и, следовательно, количество адресуемых единиц хранения и количество битов в каждой единице варьируется среди компьютеров. Физический адрес - это конечный результат всех преобразований других типов адресов, перечисленных далее. На нём кончается работа внутри центрального процессора по преобразованию адресов.

Эффективные адреса

Эффективный адрес — это начало пути вычисления физического адреса. Он задаётся в аргументах индивидуальной машинной инструкции, и вычисляется из значений регистров, смещений и масштабирующих коэффициентов, заданных в ней явно или неявно.

Логические адреса

Без знания номера и параметров сегмента, в котором указан эффективный адрес, последний бесполезен. Сам сегмент выбирается ещё одним числом, именуемым селектором. Пара чисел, записываемая как selector:offset, получила имя логический адрес. Так как активные селекторы хранятся в группе специальных регистров, чаще всего вместо первого числа в паре записывается имя регистра, например, ds:0x11223344 [Источник 3] . В старых компьютерах логические и физические адреса были согласованы, но с момента появления виртуальной памяти у большинства прикладных программ нет информации о физических адресах. Скорее, они адресуют логические адреса [Источник 4] или виртуальные адреса, используя блок управления памятью компьютера и отображение памяти операционной системы.

Линейные адреса

Эффективный адрес — это смещение от начала сегмента — его базы. Если сложить базу и эффективный адрес, то получим число, называемое линейным адресом:

lin_addr = segment.base + eff_addr

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

Виртуальные адреса

В литературе и в документации других архитектур встречается ещё один термин — виртуальный адрес. Он не используется в документации Intel на IA-32, однако встречается, например, в описании Intel® Itanium, в котором сегментация не используется. Можно смело считать, что для IA-32 виртуальный == линейный. В советской литературе по вычислительной технике этот вид адресов также именовался математическим.

Единица измерения адреса

Некоторые старые компьютеры (десятичные компьютеры) были десятизначными с цифровой адресацией. Например, каждый адрес в магнитной памяти IBM 1620 идентифицировал одну шестиразрядную двоично-кодированную десятичную цифру, состоящую из бита четности, бита флага и четырех числовых битов. В 1620 использовались пятизначные десятичные адреса, поэтому в теории максимально возможный адрес был 99,999. На практике CPU поддерживал 20000 ячеек памяти и мог добавить до двух дополнительных модулей внешней памяти, каждый из которых поддерживает 20 000 адресов, в общей сложности 60 000 (00000-59999).

Размер слова в зависимости от размера адреса

Размер слова является характеристикой для данной архитектуры компьютера. Он обозначает количество цифр, которое процессор может обрабатывать за один раз. Современные процессоры, включая встроенные системы, обычно имеют размер слова 8, 16, 24, 32 или 64 бита; Большинство современных компьютеров общего назначения используют 32 или 64 бита. В истории же использовалось много различных вариантов, включая 8, 9, 10, 12, 18, 24, 36, 39, 40, 48 и 60 бит.

Очень часто, когда речь идет о размере слова современного компьютера, также оценивается размер адресного пространства на этом компьютере. Например, компьютер, называемый «32-битным», также обычно разрешает 32-разрядные адреса памяти; 32-разрядный компьютер с байтовой адресацией может адресовать 2^32 = 4,294,967,296 байт памяти или 4 гибибайта (GB). Это позволяет эффективно хранить адрес памяти одним словом.

Теоретически современные 64-разрядные компьютеры с байтовой адресацией могут адресовать 2 64 байта, но на практике объем памяти ограничен процессором, контроллером памяти или особенностями печатной платы (например, количеством разъемов физической памяти или количеством паяемой памяти).

Содержание отдельной ячейки памяти

Каждая ячейка памяти на компьютере с хранимой программой хранит двоичное число или десятичное число некоторого типа. Эти числа определяются как данные или как команды, а их использование определяется командами, которые извлекают и взаимодействуют с ними. Некоторые «ранние» программисты сочетали команды и данные в словах как способ сэкономить память: «Манчестер-Марк-1» имел место в своих 40-битных словах для хранения нескольких бит данных - его процессор игнорировал небольшую секцию в середине слова - и это часто использовалось как эксплойт для хранения дополнительных данных. Самовоспроизводящиеся программы, такие как вирусы, иногда рассматривают себя как данные, а иногда как команды. Самовоспроизводящийся код в настоящее время устаревает, поскольку его тестирование и техническое обслуживание непропорционально сложно для экономии нескольких байт, а также он может выдавать неверные результаты из-за предположений компилятора или процессора относительно состояния машины, но все же он иногда используется намеренно, с большой осторожностью.

Адресное пространство в программировании приложений

В современной многозадачной среде процессы приложений обычно имеют в своем адресном пространстве (или пространствах) куски памяти следующих типов:

  • Машинный код, в том числе:
    • Собственный код программы;
    • Совместно используемые библиотеки.
    • Инициализированные данные;
    • Неинициализированные (но выделенные) переменные;
    • Стек для переменных исполняемой программы;
    • Куча;
    • Совместно используемая память и отображенные в память файлы.

    Некоторые части адресного пространства могут вообще не отображаться.

    Схемы адресации

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

    Модели памяти

    Многие программисты предпочитают адресовать память таким образом, чтобы не было различий между пространством кода и пространством данных, а также физической и виртуальной памятью, другими словами, численно идентичные указатели относятся к точно одному и тому же байту ОЗУ.

    Однако многие старые компьютеры не поддерживали плоскую модель памяти - в частности, аппараты архитектуры Harvard вынуждали память с командами полностью отделяться от памяти с данными. Многие современные DSP(digital signal processor) (такие как Motorola 56000) имеют три отдельные области хранения - хранение программ, хранение коэффициентов и хранение данных. Некоторые часто используемые команды извлекаются из всех трех областей одновременно - меньшее количество областей хранения (даже если бы были одинаковые общие байты памяти) приводило бы к замедлению выполнения этих команд.

    Модели памяти в х86 архитектуре

    Старые компьютеры x86 использовали сегментированные адреса модели памяти на основе комбинации двух чисел: сегмента памяти и смещения внутри этого сегмента. Некоторые сегменты неявно трактовались как сегменты кода, предназначенные для команд, сегментов стека или обычных сегментов данных. Хотя использование было разным, сегменты не имели какой-либо защиты памяти. В плоской модели памяти все сегменты (сегментные регистры) обычно устанавливаются в ноль, и только смещения являются переменными.

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

    СОДЕРЖАНИЕ

    Физические адреса

    Логические адреса

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

    Единица разрешения адреса

    Некоторые старые компьютеры (компьютеры с десятичным числом ) имели адрес с десятичной цифрой . Например, каждый адрес в IBM 1620 «S память на магнитных сердечниках идентифицирован один шесть бит двоично-десятичном разряд, состоящий из бита четности , бит флага и четыре цифровых битов. В 1620 использовались пятизначные десятичные адреса, поэтому теоретически максимально возможным адресом было 99 999. На практике ЦП поддерживал 20 000 ячеек памяти, и можно было добавить до двух дополнительных модулей внешней памяти, каждый из которых поддерживает 20 000 адресов, всего 60 000 (00000–59999).

    Размер слова по сравнению с размером адреса

    Размер слова - это характеристика компьютерной архитектуры, обозначающая количество бит, которые ЦП может обработать за один раз. Современные процессоры, включая встроенные системы , обычно имеют размер слова 8, 16, 24, 32 или 64 бита; большинство современных компьютеров общего назначения используют 32 или 64 бита. Исторически использовалось много разных размеров, включая 8, 9, 10, 12, 18, 24, 36, 39, 40, 48 и 60 бит.

    Очень часто, говоря о размере слова в современном компьютере, также описывают размер адресного пространства на этом компьютере. Например, компьютер, называемый « 32-битным », также обычно допускает 32-битные адреса памяти; 32-разрядный компьютер с байтовой адресацией может адресовать 2 32 = 4 294 967 296 байт памяти или 4 гибибайта (ГиБ). Это позволяет эффективно хранить один адрес памяти в одном слове.

    Теоретически современные 64-битные компьютеры с байтовой адресацией могут адресовать 2 64 байта (16 эксбибайт ), но на практике объем памяти ограничен ЦП, контроллером памяти или конструкцией печатной платы (например, количеством физических разъемы памяти или количество распаянной памяти).

    Содержимое каждой ячейки памяти

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

    Некоторые ранние программисты объединили инструкции и данные в словах, чтобы сэкономить память, когда это было дорого: у Manchester Mark 1 было место в 40-битных словах для хранения небольших битов данных - его процессор игнорировал небольшой участок в середине одно слово - и это часто использовалось как дополнительное хранилище данных. Самовоспроизводящиеся программы, такие как вирусы, иногда воспринимают себя как данные, а иногда как инструкции. Самомодифицирующийся код , как правило , не рекомендуются в настоящее время, так как это делает тестирование и обслуживание несоразмерно трудно экономии нескольких байт, а также может дать неверные результаты из - за компилятор или предположений процессора о машинах состоянии , но до сих пор иногда используются намеренно, с большой осторожностью.

    Адресное пространство в прикладном программировании

    В современной многозадачной среде процесс приложения обычно имеет в своем адресном пространстве (или пробелах) блоки памяти следующих типов:

    • Машинный код , в том числе:
      • собственный код программы (исторически известный как сегмент кода или текстовый сегмент );
      • общие библиотеки .
      • инициализированные данные ( сегмент данных );
      • неинициализированные (но выделенные) переменные;
      • стек времени выполнения ;
      • куча ;
      • совместно используемая память и файлы с отображением памяти .

      Некоторые части адресного пространства могут вообще не отображаться.

      Некоторые системы имеют архитектуру «разделенной» памяти, где машинный код, константы и данные находятся в разных местах и ​​могут иметь разный размер адреса. Например, микроконтроллеры PIC18 имеют 21-битный программный счетчик для адресации машинного кода и констант во флэш-памяти и 12-битные адресные регистры для адресации данных в SRAM.

      Схемы адресации

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

      Сопоставление логических адресов с физической и виртуальной памятью также добавляет несколько уровней косвенности; см. ниже.

      Модели памяти

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

      Однако многие ранние компьютеры не поддерживали такую ​​модель плоской памяти - в частности, машины с гарвардской архитектурой заставляют хранилище программ быть полностью отделено от хранилища данных. Многие современные DSP (например, Motorola 56000 ) имеют три отдельных области хранения - программную память, память коэффициентов и память данных. Некоторые часто используемые инструкции извлекаются из всех трех областей одновременно - меньшее количество областей памяти (даже если бы было одинаковое общее количество байтов памяти) замедлило бы выполнение этих инструкций.

      Модели памяти в архитектуре x86

      Ранние компьютеры x86 использовали адреса модели сегментированной памяти на основе комбинации двух чисел: сегмента памяти и смещения внутри этого сегмента.

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

      Это шестая статья цикла о микроконтроллерах. В предыдущей статье " Микроконтроллеры для начинающих. Часть 5. Архитектура. Адресные пространства и память " мы узнали, как процессор связан с памятью и что такое адресные пространства. Сегодня мы рассмотрим как устроена работа с памятью внутри этих адресных пространств. Это обязательная к изучению тема, имеющая непосредственное отношение к практике использования микроконтроллеров.

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

      Линейная адресация памяти

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

      Пример линейной адресации памяти не зависящий от физической реализации модуля памяти. Иллюстрация моя Пример линейной адресации памяти не зависящий от физической реализации модуля памяти. Иллюстрация моя

      На рисунке выше я показал физическую память состоящую из нескольких отдельных блоков. Каждый блок памяти имеет свои адреса ячеек, которые могут совпадать с адресами в других блоках. Однако, блок управления памятью скрывает от программы все тонкости физической реализации, что позволяет считать всю память единым блоком, единой совокупностью, последовательно пронумерованных ячеек.

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

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

      Ограничения линейной адресации

      Так адрес ячейки памяти может оказаться слишком длинным. Так адресация памяти из 256 ячеек требует адреса диной 1 байт (8 бит). А для 64К ячеек (65536 ячеек) нужно уже 16 бит, или 2 байта. Как я уже говорил в " Микроконтроллеры для начинающих. Часть 2. Процессор микроконтроллера ", каждая машинная инструкция, за некоторым исключением, включает в себя один или несколько операндов. Если операнд представляет собой адрес ячейки памяти, а у нас адрес занимает 2 байта, то машинная инструкция не может занимать менее 3 байт (нужно же и код команды где то разместить).

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

      Во первых, сразу можно заметить, что у нас разные адресные пространства программ и данных, так как используется Гарвардская архитектура (о чем я писал в предыдущей статье). Объем памяти данных часто меньше, чем объем памяти программ. А значит, в инструкция работающих с данными мы можем уменьшить размер поля адреса операнда. А в инструкциях работающих с адресами инструкция (инструкции перехода) выделить под адрес больше места.

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

      Страничная (банковая) адресация памяти

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

      Но это же лишняя работа и дополнительные затраты памяти команд! Не совсем так. Дело в том, что данные, которые обрабатывает программа, занимают не так много места и группируются в памяти в виде отдельных "островков". И это касается не только обработки массивов, но и в целом локальных переменных. А значит, указав один раз номер блока памяти мы можем в дальнейшем работать только с ячейками внутри него. И требуемый объем памяти программ уменьшится.

      Блоки, на которые разбивается единое пространство памяти называют страницами. Думаю, многим это понятие знакомо. Как минимум, по процессорам 80х86. Существует и еще одно название - банк. Иногда, блоки памяти программ называют страницами, а блоки памяти данных банками.

      Пример показывающий принцип страничной адресации памяти объемом 2К ячеек разбитой на 4 страницы по 256 ячеек каждая. Иллюстрация моя Пример показывающий принцип страничной адресации памяти объемом 2К ячеек разбитой на 4 страницы по 256 ячеек каждая. Иллюстрация моя

      Что то не то с этой иллюстрацией? Вы правы! Здесь показан сам принцип деления адреса на две части, но не понятно, в чем же тут выгода. Действительно, ведь длина адреса, если судить по иллюстрации не изменилась. Дело в том, что полный адрес физической ячейки памяти на самом деле формируется так

      Пример страничной организации памяти и формирования физического адреса из логического и номера страницы хранящейся в регистре PAGE REG. Иллюстрация моя Пример страничной организации памяти и формирования физического адреса из логического и номера страницы хранящейся в регистре PAGE REG. Иллюстрация моя

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

      Мы сэкономили немного памяти программ, но получили усложнение в работе с памятью. Теперь, последовательно увеличивая адрес ячейки памяти, мы можем перемещаться только внутри страницы. Так? Почти.

      Для памяти данных это, обычно, действительно так. А вот для памяти программ, обычно, последовательный перебор адресов (последовательное выполнение инструкций) позволяет игнорировать границы страниц.

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

      Пара слов о реальных микроконтроллерах

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

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

      В микроконтроллерах AVR Atmel (Microchip!) используется линейная адресация, но там свои тонкости. А запись с память программ тоже выполняется блоками.

      Заключение

      Мы почти (но только почти!) заканчиваем разбираться с организацией памяти в микроконтроллерах. В следующей статье я расскажу о методах адресации операндов в машинных инструкциях. После чего будут статьи с более подробным описанием памяти в различных реальных микроконтроллерах. Ну а там и до системы машинных инструкций доберемся. А дальше будет попроще.

      Читайте также: