|
Загрузить константу в регистр |
|
|
|
Jul 9 2009, 16:19
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата Команда LDR не такая "тупая", как многим кажется. А никто не противится. Только это не команда, а макрос ассемблера. Цитата При этом хочется спросить, а какая "половая" разница в выкрутасных командах других RISC от LDR? По любому, в худшем случае 32-битная переменная загрузится за две команды. А глубокий смысл в том, что из области памяти, где хранится программа, данные читаются последовательно
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jul 9 2009, 17:03
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата ARM называет LDR псевдокомандой. Не возражаю  Главное, что все-же не "командой", именно это я хотел подчеркнуть. Цитата По п.2 ARM ассемблер размещает "неудобную" константу по-близости (<4KB) от реальной команды загрузки константы, минимизируя тем самым время доступа к ней. Дальше 4х килобайт он банально не может разместить - не хватает разрядности смещения в коде команды. Но суть совсем не в дистанции, а в том, что выборка перестает быть последовательной.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jul 9 2009, 19:32
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(Rst7 @ Jul 9 2009, 21:03)  Не возражаю  Главное, что все-же не "командой", именно это я хотел подчеркнуть. Дальше 4х килобайт он банально не может разместить - не хватает разрядности смещения в коде команды. Но суть совсем не в дистанции, а в том, что выборка перестает быть последовательной. А вы возметесь оценить потери от такой непоследовательной выборки? Думается, что на практике - это плюнуть и забыть.
|
|
|
|
|
Jul 9 2009, 19:59
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(aaarrr @ Jul 10 2009, 01:53)  Оценить можно - на ARM7TDMI LDR выполняется за 3 такта, а команда типа MOV Rd, imm - за 1. Т.е. теряем такт по сравнению с загрузкой двумя "простыми" командами (ну, если бы они существовали, конечно). В LPC2ххх выполняя прогу из флэша команда LDR Rx,=imm будет выполняться дольше. в зависимости от настроек MAM, вполне возможно что и 5 и 6 тактов. Но если проц работает на частоте до 20 МГц, то 3 такта тоже может быть, но не меньше.
Сообщение отредактировал GetSmart - Jul 9 2009, 20:00
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 10 2009, 05:30
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата А если написать LDR Rn, [PC], #8 и в нужное место вставить константу - такое не практикуется? По аналогии с DEC: MOV Rn, (PC)+ Тогда и выборка не нарушится. Может в ассемблере есть соответствующие средства для такой записи? Такой случай там описан в документации: Цитата Load and Store Word or Unsigned Byte - Immediate pre-indexed .... Syntax [<Rn>, #+/-<offset_12>]! .... Use of R15 Specifying R15 as register Rn has UNPREDICTABLE results. Так что нельзя. Цитата Значит адреса всех переменных должны храниться в памяти команд? Че-то не то... Так и есть. Цитата Ну, это частный случай кэшированного процессора, если можно так выразиться. Случай-то частный, но отсутствие загрузки любых непосредственных операндов не позволяет, например, простыми средствами (без внутренних кешей) выполнять код из внешней SDRAM без дикой потери производительности. А вот AVR32 даже в инкарнации AT32UC3A0512 - вполне. Дует себе в burst-режиме и все пучком.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jul 10 2009, 07:08
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(Rst7 @ Jul 10 2009, 09:30)  Такой случай там описан в документации: Так что нельзя. В документации написано следующее: Цитата 4.10.5 Use of R15 Write-back should not be specified if R15 is specified as the base register (Rn).
When using R15 as the base register you must remember it contains an address 8 bytes on from the address of the current instruction.
R15 should not be specified as the register offset (Rm).
When R15 is the source register (Rd) of a Half-word store (STRH) instruction, the stored address will be address of the instruction plus 12. Значит как-то можно Цитата(Rst7 @ Jul 10 2009, 09:30)  Цитата Значит адреса всех переменных должны храниться в памяти команд? Че-то не то... Так и есть. Что "так и есть"? Что адреса всех переменных должны храниться в памяти команд? Или что это "что-то не то"? Не верится мне что разработчики АРМа не предусмотрели такой элементарной вещи как заргузка в регистр адреса переменной из памяти данных.
|
|
|
|
|
Jul 10 2009, 07:25
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата В документации написано следующее: ... Тут написано, что значение 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
Цитата Не верится мне что разработчики АРМа не предусмотрели такой элементарной вещи как заргузка в регистр адреса переменной из памяти данных. Даже более глобально - отсутствие прямой загрузки любого непосредственного операнда (который может являться адресом другой ячейки).
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jul 10 2009, 08:50
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(Rst7 @ Jul 10 2009, 11:25)  Тут написано, что значение R15 "опережает" текущий адрес команды на 8 (или на 12). А цитату о невозможности write-back'а в R15 я привел выше. Ну, значит в принципе можно? Только считываемую константу разместить не сразу после команды, а через две, с учетом конвейера. Цитата(Rst7 @ Jul 10 2009, 11:25)  Да. Именно так. Вот, например, обратите внимание на обращение к статическим переменным ... Даже более глобально - отсутствие прямой загрузки любого непосредственного операнда (который может являться адресом другой ячейки). Что же тогда хорошего в этом АРМе?
|
|
|
|
|
Jul 10 2009, 09:15
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата Ну, значит в принципе можно? Только считываемую константу разместить не сразу после команды, а через две, с учетом конвейера. Вы не читаете, что я Вам пишу? Я же процитировал мануал от ARM'а - нельзя использовать R15 в режиме инкрементной/декрементной адресации. Цитата Что же тогда хорошего в этом АРМе?
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|