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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Загрузить константу в регистр
777777
сообщение Jul 9 2009, 11:51
Сообщение #1


Профессионал
*****

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



Решил изучить ARM, смотрю систему команд и не вижу загрузки любой константы в регистр. Как это сделать, неужели нужно извращаться через R15 с автоинкрементом?
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jul 9 2009, 12:08
Сообщение #2


Йа моск ;)
******

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



Обычно некоторый набор констант можно загрузить, используя байтовый иммедитейт и сдвиг. Остальное - LDR по PC+что-то (константы лежат рядом с кодом, а не внутри, так что без автоинкремента). Есть такой недостаток у ARM'а.

Посмотрите, например, как это делает любой сишный компилятор. Да и многие ассемблеры поддерживают макрос типа "LDR Rx,=число" с автоматической генерацией нужного кода и данных.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 9 2009, 12:12
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(777777 @ Jul 9 2009, 14:51) *
неужели нужно извращаться через R15 с автоинкрементом?
Любую константу косвенно через любой регистр. Удобнее всего через R15, да. А как иначе встроить произвольное 32-битное число в 32-битный или 16-битный (THUMB) код команды? Если контанту можно представить как сдвинутое на произвольное число бит 8-битное число (опционально с инверсией), то это можно сделать одной командой MOV (MVN).


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jul 9 2009, 12:22
Сообщение #4


Йа моск ;)
******

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



Цитата
А как иначе встроить произвольное 32-битное число в 32-битный или 16-битный (THUMB) код команды?


Ну тумба - это чисто для пеара wink.gif А вот в ARM-режиме могли бы и подумать. Например, тот же PPC для загрузки иммедитейтов имеет специальную последовательность из двух команд - загрузка старших 16ти бит (младшие заполняются нулями) и затем OR с непосредственным шестнадцатибитным операндом. 32+32=64 бита, что эквивалентно гипотетической команде загрузки 32хбитного операнда - 32 бита команда + 32 бита операнд. Аналогичная фича есть в AVR32.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 9 2009, 16:11
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Команда LDR не такая "тупая", как многим кажется. Если константу удается представить в виде некоторой другой константы со сдвигом, ассемблер на самом деле вставит соответствующий MOV, т.е. реализует это в виде одной команды. А LDR, в общем виде перекладывает эти проблемы с головы программиста на компилятор.

При этом хочется спросить, а какая "половая" разница в выкрутасных командах других RISC от LDR? По любому, в худшем случае 32-битная переменная загрузится за две команды.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jul 9 2009, 16:19
Сообщение #6


Йа моск ;)
******

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



Цитата
Команда LDR не такая "тупая", как многим кажется.


А никто не противится. Только это не команда, а макрос ассемблера.

Цитата
При этом хочется спросить, а какая "половая" разница в выкрутасных командах других RISC от LDR? По любому, в худшем случае 32-битная переменная загрузится за две команды.


А глубокий смысл в том, что из области памяти, где хранится программа, данные читаются последовательно


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 9 2009, 16:27
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(Rst7 @ Jul 9 2009, 20:19) *
А никто не противится. Только это не команда, а макрос ассемблера.



А глубокий смысл в том, что из области памяти, где хранится программа, данные читаются последовательно


ARM называет LDR псевдокомандой.

По п.2 ARM ассемблер размещает "неудобную" константу по-близости (<4KB) от реальной команды загрузки константы, минимизируя тем самым время доступа к ней.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jul 9 2009, 17:03
Сообщение #8


Йа моск ;)
******

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



Цитата
ARM называет LDR псевдокомандой.


Не возражаю smile.gif Главное, что все-же не "командой", именно это я хотел подчеркнуть.

Цитата
По п.2 ARM ассемблер размещает "неудобную" константу по-близости (<4KB) от реальной команды загрузки константы, минимизируя тем самым время доступа к ней.


Дальше 4х килобайт он банально не может разместить - не хватает разрядности смещения в коде команды. Но суть совсем не в дистанции, а в том, что выборка перестает быть последовательной.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 9 2009, 19:32
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(Rst7 @ Jul 9 2009, 21:03) *
Не возражаю smile.gif Главное, что все-же не "командой", именно это я хотел подчеркнуть.



Дальше 4х килобайт он банально не может разместить - не хватает разрядности смещения в коде команды. Но суть совсем не в дистанции, а в том, что выборка перестает быть последовательной.

А вы возметесь оценить потери от такой непоследовательной выборки? Думается, что на практике - это плюнуть и забыть.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 9 2009, 19:53
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(sergeeff @ Jul 9 2009, 23:32) *
А вы возметесь оценить потери от такой непоследовательной выборки? Думается, что на практике - это плюнуть и забыть.

Оценить можно - на ARM7TDMI LDR выполняется за 3 такта, а команда типа MOV Rd, imm - за 1. Т.е. теряем такт по сравнению с загрузкой двумя "простыми" командами (ну, если бы они существовали, конечно).

А вот если взять процессор с раздельными кэшами, то все получается совсем плохо - такой LDR может вызвать DCache linefill из области программ, и будет это делать довольно часто.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 9 2009, 19:59
Сообщение #11


.
******

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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 9 2009, 20:03
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(GetSmart @ Jul 9 2009, 23:59) *
В LPC2ххх выполняя прогу из флэша команда LDR Rx,=imm будет выполняться дольше. в зависимости от настроек MAM, вполне возможно что и 5 и 6 тактов.

Ну, это частный случай кэшированного процессора, если можно так выразиться.
Go to the top of the page
 
+Quote Post
777777
сообщение Jul 10 2009, 04:21
Сообщение #13


Профессионал
*****

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



Цитата(Rst7 @ Jul 9 2009, 16:08) *
Обычно некоторый набор констант можно загрузить, используя байтовый иммедитейт и сдвиг. Остальное - LDR по PC+что-то (константы лежат рядом с кодом, а не внутри, так что без автоинкремента).

А если написать LDR Rn, [PC], #8 и в нужное место вставить константу - такое не практикуется? По аналогии с DEC: MOV Rn, (PC)+
Тогда и выборка не нарушится. Может в ассемблере есть соответствующие средства для такой записи?

Допустим я хочу загрузить в регистр адрес переменной из памяти данных для последующего косвенного обращения к ней. Поскольку она находятся в другом сегменте, я не могу это сделать просто прибавляя смещение к счетчику команд. Значит адрес этой переменной должен находиться в памяти команд в том сегменте из которого я к ним обращаюсь? Значит адреса всех переменных должны храниться в памяти команд? Че-то не то... sad.gif
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jul 10 2009, 05:30
Сообщение #14


Йа моск ;)
******

Группа: Модераторы
Сообщений: 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-режиме и все пучком.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
777777
сообщение Jul 10 2009, 07:08
Сообщение #15


Профессионал
*****

Группа: Участник
Сообщений: 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) *
Цитата
Значит адреса всех переменных должны храниться в памяти команд? Че-то не то...

Так и есть.

Что "так и есть"? Что адреса всех переменных должны храниться в памяти команд? Или что это "что-то не то"? Не верится мне что разработчики АРМа не предусмотрели такой элементарной вещи как заргузка в регистр адреса переменной из памяти данных.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 25th June 2025 - 16:54
Рейтинг@Mail.ru


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