реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Вопрос по ассемблеру ARM, Не пойму как расчитывается смещение
NeDoEng
сообщение May 17 2016, 09:26
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 17-04-16
Пользователь №: 91 333



Вот, например, запускаю симулятор и смотрю дизассемблер startup_stm32f10x_md.s

Строку 133: LDR R0, =SystemInit
компилятор разворачивает в строку:

0x0800016C 4809 LDR r0,[pc,#36] ; @0x08000194
Это значит, что будет загружено в R0 значение из памяти по адресу PC+36. И в данный момент PC = 0x0800016C.

НО!
0x0800016C+36 = 0x08000190. Хотя компилятор в комментарии указывает другой адрес - на 4 байта больше. И в самом деле обращение идет по адресу 0x08000194. Как получилась такая разница? Сначала инкрементируется счетчик команд на 4 (переход к след. команде), а потом выполняется сложение и пр?
Go to the top of the page
 
+Quote Post
GetSmart
сообщение May 17 2016, 11:20
Сообщение #2


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Найдите в поисковике "ARMv6-M Architecture Reference Manual" aka ARM DDI 0419C и скачайте PDF. Если stm32f10x это CM0. Там есть описание команды LDR со всеми нюансами.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
SII
сообщение May 17 2016, 11:45
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414



Если разбираетесь с ассемблером, необходимо достаточно внимательно читать документацию на архитектуру, а не только описания отдельных команд и т.п. В частности, PC увеличивается сразу после выборки команды, а не после её выполнения. Кроме того, его адрес для вычисления адреса обращения к памяти может "корректироваться" не вполне очевидным поначалу способом (связано с любовью АРМов к выровненным на соответствующую границу доступам). Именно эти вещи и имеют место в данном случае.
Go to the top of the page
 
+Quote Post
NeDoEng
сообщение May 17 2016, 12:09
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 17-04-16
Пользователь №: 91 333



Цитата(GetSmart @ May 17 2016, 14:20) *
Найдите в поисковике "ARMv6-M Architecture Reference Manual" aka ARM DDI 0419C и скачайте PDF. Если stm32f10x это CM0. Там есть описание команды LDR со всеми нюансами.


stm32f10x это CM3, но не суть. Спасибо за наводку. Касательно конкретно CM3 не нашел описания. Думал почитать смежно, но это может оказаться плохой идеей. Вдруг чего там намутили разработчики.

Цитата(SII @ May 17 2016, 14:45) *
Если разбираетесь с ассемблером, необходимо достаточно внимательно читать документацию на архитектуру, а не только описания отдельных команд и т.п. В частности, PC увеличивается сразу после выборки команды, а не после её выполнения. Кроме того, его адрес для вычисления адреса обращения к памяти может "корректироваться" не вполне очевидным поначалу способом (связано с любовью АРМов к выровненным на соответствующую границу доступам). Именно эти вещи и имеют место в данном случае.


Тут наверное замешан т.н. "Prefetch unit". как я понял он выполняет предварительную выборку след. команды, но не выполняет ее. Вот он и увеличивает счетчик на 4 (как раз на размер команды). А затем сама команда увеличивает еще на 36. Итого получится PC+40.
Нашел в Cortex-M3 Technical Reference Manual
Цитата
In pipelined processors, the process of fetching instructions from memory to fill up the pipeline
before the preceding instructions have finished executing. Prefetching an instruction does not
mean that the instruction has to be executed.

Попробую сделать тестовый проект на ассемблере. (ну дык я на С++ пишу)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение May 17 2016, 12:19
Сообщение #5


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(NeDoEng @ May 17 2016, 16:09) *
Касательно конкретно CM3 не нашел описания.

Тогда это ARMv7-M. На сайте АРМа скачивается через регистрацию. В поисковиках можно найти за так.

Цитата
Тут наверное замешан т.н. "Prefetch unit". ......Вот он и увеличивает счетчик на 4 (как раз на размер команды).

Увеличивает ПО-РАЗНОМУ. Читайте описание LDR конкретного ядра + режима (инструкции 32/16 бит).

Размер команд в Тумбе-2 может быть и 16 и 32 бита. То есть нельзя говорить, что на размер команды.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
NeDoEng
сообщение May 17 2016, 12:32
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 17-04-16
Пользователь №: 91 333



Цитата(GetSmart @ May 17 2016, 15:19) *
Тогда это ARMv7-M. На сайте АРМа скачивается через регистрацию. В поисковиках можно найти за так.


Увеличивает ПО-РАЗНОМУ. Читайте описание LDR конкретного ядра + режима (инструкции 32/16 бит).

Размер команд в Тумбе-2 может быть и 16 и 32 бита. То есть нельзя говорить, что на размер команды.

Во как, спасибо за разъяснения. Теперь все понятно.
Go to the top of the page
 
+Quote Post
obi wan
сообщение Jun 15 2016, 13:31
Сообщение #7





Группа: Участник
Сообщений: 5
Регистрация: 26-02-13
Пользователь №: 75 792



The Definitive Guide to the ARM Cortex-M3 by Joseph Yiu Chapter 3
"Program Counter R15
R15 is the program counter. You can access it in assembler code by either R15 or PC. Due to
the pipelined nature of the Cortex-M3 processor, when you read this register you will find that
the value is different than the location of the executing instruction by 4. For example:
0x1000 : MOV R0, PC ; R0 = 0x1004
Writing to the program counter will cause a branch (but link registers do not get updated).
Since an instruction address must be half word aligned, the LSB (bit 0) of the program
counter read value is always 0. However, in branching, either by writing to PC or using branch
instructions, the LSB of the target address should be set to 1 because it is used to indicate
the Thumb state operations. If it is 0, it can imply trying to switch to the ARM state and will
result in a fault exception in the Cortex-M3."
Наверно в тему.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 09:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01397 секунд с 7
ELECTRONIX ©2004-2016