Цитата
В документации написано следующее:
...
Тут написано, что значение R15 "опережает" текущий адрес команды на 8 (или на 12). А цитату о невозможности write-back'а в R15 я привел выше.
Цитата
Значит как-то можно
НельзяЦитата
Что адреса всех переменных должны храниться в памяти команд?
Да. Именно так. Вот, например, обратите внимание на обращение к статическим переменным
CODE
\ In segment CODE, align 4, keep-with-next
336 void start_vibra(void)
337 {
\ start_vibra:
\ 00000000 10402DE9 PUSH {R4,LR}
338 extern const int VIBR_TYPE;
339 void stop_vibra(void);
340 if((Is_Vibra_Enabled)&&(!IsCalling()))
\ 00000004 ........ LDR R4,??DataTable29 ;; S_ICONS
\ 00000008 A40094E5 LDR R0,[R4, #+164]
\ 0000000C 000050E3 CMP R0,#+0
\ 00000010 1080BD08 POPEQ {R4,PC}
\ 00000014 6E0000EF SWI +110
\ 00000018 000050E3 CMP R0,#+0
\ 0000001C 1080BD18 POPNE {R4,PC}
341 {
342 extern const unsigned int vibraPower;
343 SetVibration(vibraPower);
\ 00000020 34009FE5 LDR R0,??start_vibra_0 ;; vibraPower
\ 00000024 000090E5 LDR R0,[R0, #+0]
\ 00000028 7C0000EF SWI +124
344 if(VIBR_TYPE)
\ 0000002C ........ LDR R1,??DataTable12 ;; VIBR_TYPE
\ 00000030 28209FE5 LDR R2,??start_vibra_0+0x4 ;; stop_vibra
\ 00000034 001091E5 LDR R1,[R1, #+0]
\ 00000038 DC0FA0E3 MOV R0,#+880
\ 0000003C 000051E3 CMP R1,#+0
\ 00000040 0100000A BEQ ??start_vibra_1
345 GBS_StartTimerProc(&tmr_vibra,TMR_SECOND>>2,stop_vibra);
\ 00000044 3610A0E3 MOV R1,#+54
\ 00000048 000000EA B ??start_vibra_2
346 else
347 GBS_StartTimerProc(&tmr_vibra,TMR_SECOND>>1,stop_vibra);
\ ??start_vibra_1:
\ 0000004C 6C10A0E3 MOV R1,#+108
\ ??start_vibra_2:
\ 00000050 040080E0 ADD R0,R0,R4
\ 00000054 4D0000EF SWI +77
348 }
349 }
\ 00000058 1080BDE8 POP {R4,PC} ;; return
\ ??start_vibra_0:
\ 0000005C ........ DC32 vibraPower
\ 00000060 ........ DC32 stop_vibra
350
Цитата
Не верится мне что разработчики АРМа не предусмотрели такой элементарной вещи как заргузка в регистр адреса переменной из памяти данных.
Даже более глобально - отсутствие прямой загрузки любого непосредственного операнда (который может являться адресом другой ячейки).