Ваша проблема в том, что Вы не знаете команд Cortex. Вы их неправильно понимаете.
Команда
LDR r0,[pc,#32] ; @0x08000210;
загружает в регистр R0 4-байтное значение (число), которое находится рядом с кодом программы. Доступ к этому значению осуществляется относительно программного счетчика. В комментариях к листингу указан адрес -- 0х08000210.
Видимо, в исходном тексте программы Вы описывали переменную (точнее -- константу). А это ничто иное, как данные. Данные бывают разные -- константы, переменные. Переменные бывают инициализированными и неинициализированными. Кроме данных, в программах присутствует код. В общем, программа состоит из разного рода кирпичиков.
Более того, проекты, как правило, представляют представляют собой (или состоят из) нескольких исходных файлов. Каждый исходный файл проекта может иметь и программный код, и константы, и инициализированные данные и так далее. Так вот, задача ликовщика заключается в том, чтобы пройтись по всем объектным (откомпилированным) файлам и сгруппировать "корпичики" в кучки. Кучка кирпичиков типа "программный код", кучка кирпичиков типа "инициализированные данные", кучка кирпичиков типа "неинициализированные данные" и так далее.
Эти кучки называются секциями. Вы наверно уже встречались с их названиями -- .text, .bss, .data и так далее. Названия секций у разных компиляторов (линковщиков) могут отличаться. Я сижу в Линуксе и использую gcc, Вы сидите под Виндовсом и используете Кайл. У нас секции скорее всего будут называться по-разному. Но назначение секций, как правило, соблюдается.
Итак, возвращаемся к Вашей программе. У вас в коде, было какое-то определение данных. Эти данные после линковки попали на адрес, который находится рядом с секцией кода. Чтобы переместить эти данные (значение) из памяти в регистр, понятно, нужно как-то адресовать эту ячейку памяти. Для данного случая оказалось удобнее адресовать ее относительно программного счетчика, что и было сделано приведеной выше командой.
Следующая команда
MOV r1,#0xE000E000;
запиысывает в регистр R1 базовый адрес Системного Таймера.
Системный Таймер -- это группа регистров. Точно так же следует думать и про другие устройства. Например, порт ввода-вывода -- это тоже группа регистров с каким-то базовым адресом. USART, DMA, ADC и так далее -- все эти устройства имеют по нескольку (иногда даже десятков) регистров.
С одной стороны, в микроконтроллерах многие устройства зачастую присутствуют в нескольких экземплярах. А с другой, адресное пространство для регистров практически не ограничено (как антипример, микроконтроллеры ATMEL AVR -- там куда-только не пихают регистры и биты!)
Поэтому оказывается, что более удобно выделить для конкретного устройства базовый адрес в этом адресном пространстве и более не париться с размещением битов и байтов. Но так как, допустим, портов ввода-вывода в микроконтроллере может быть несколько экземпляров, а они все одинаковые, то было бы разумно для каждого порта назначить какой-то базоавый адрес для группы его регистров. А доступ к конкретному регистру осуществлять относительно этого базоаого адреса. Таким образом, всё становится унифицировано и удобно
Следующая команда
STR r0,[r1,#0x14];
сохраняет содержимое регистра R0 по базовому адресу (который находится в регистре R1) плюс смещение 0х14.
(Простите за то, что опять написал много. Был в ударе.)
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|