Вот, например, запускаю симулятор и смотрю дизассемблер 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 (переход к след. команде), а потом выполняется сложение и пр?
|