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

 
 
> Вопрос по ассемблеру 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
 
Start new topic
Ответов
NeDoEng
сообщение May 17 2016, 12:09
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 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
Сообщение #3


.
******

Группа: Участник
Сообщений: 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



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 21:51
Рейтинг@Mail.ru


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