Цитата(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.
Попробую сделать тестовый проект на ассемблере. (ну дык я на С++ пишу)