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

 
 
> загрузка с декрементом указателя
Огурцов
сообщение Feb 13 2016, 09:34
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



не нашёл команду ассемблера, есть такая ?
stm32f0, 3, 4


Сообщение отредактировал Огурцов - Feb 13 2016, 09:35
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
Сергей Борщ
сообщение Feb 13 2016, 11:03
Сообщение #2


Гуру
******

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



LDMDB?


--------------------
На любой вопрос даю любой ответ
"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
SSerge
сообщение Feb 13 2016, 16:34
Сообщение #3


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

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



У M3 и M4 такая инструкция есть:
http://infocenter.arm.com/help/topic/com.a...a/BABIHJGA.html
А у M0, увы, нет:
http://infocenter.arm.com/help/index.jsp?t...b/BABIHJGA.html


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Feb 13 2016, 16:56
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



да вроде бы не совсем правильная инструкция
мне нужно загрузить данные в регистр по указателю, декрементировать указатель и перейти пока не ноль
т.е. обычный цикл, который можно легко сделать на avr
а тут что-то через указатель стека, что там с чем сравнивать и что будет с данными при прерываниях
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 13 2016, 17:20
Сообщение #5


Гуру
******

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



Цитата(Огурцов @ Feb 13 2016, 18:56) *
мне нужно загрузить данные в регистр по указателю, декрементировать указатель и перейти пока не ноль
Пока не ноль что? Указатель?


--------------------
На любой вопрос даю любой ответ
"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
SSerge
сообщение Feb 13 2016, 17:27
Сообщение #6


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

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Тогда это команды типа LDR Rt, [Rn], #offset
но, аналогично, М0 такого не умеет.
http://infocenter.arm.com/help/topic/com.a...a/BABJGHFJ.html


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Feb 13 2016, 18:10
Сообщение #7


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



Цитата(Сергей Борщ @ Feb 13 2016, 17:20) *
Указатель?

индекс


Цитата(SSerge @ Feb 13 2016, 17:27) *
Тогда это команды типа LDR Rt, [Rn], #offset

а декремент ?

Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 13 2016, 19:10
Сообщение #8


Гуру
******

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



Цитата(Огурцов @ Feb 13 2016, 20:10) *
индекс
Откуда вдруг взялся индекс?


--------------------
На любой вопрос даю любой ответ
"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
Огурцов
сообщение Feb 13 2016, 19:26
Сообщение #9


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



не, а как ещё можно быстренько пробежаться по массиву ?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 13 2016, 19:28
Сообщение #10


Гуру
******

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



Цитата(Огурцов @ Feb 13 2016, 21:10) *
а декремент ?

и декремент.
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Feb 13 2016, 19:35
Сообщение #11


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



_и_ декремент не лезет
надо было вписать в пять тактов: загрузку, сохранение, декремент, проверку и переход
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Feb 13 2016, 21:34
Сообщение #12


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



можно даже в шесть
Go to the top of the page
 
+Quote Post
SII
сообщение Feb 14 2016, 19:50
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414



LDR R0, [R1]
STR R0, [R2]
SUBS R1, #4
BNE ....
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 15 2016, 23:01
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Огурцов @ Feb 13 2016, 22:56) *
да вроде бы не совсем правильная инструкция
мне нужно загрузить данные в регистр по указателю, декрементировать указатель и перейти пока не ноль
т.е. обычный цикл, который можно легко сделать на avr
а тут что-то через указатель стека, что там с чем сравнивать и что будет с данными при прерываниях

Если не хотите читать документацию по системе команд, то хотя-бы асм-листинг этого си-кода посмотрите. С макс. оптимизацией.

Цитата(SII @ Feb 15 2016, 01:50) *
LDR R0, [R1]
STR R0, [R2]
SUBS R1, #4
BNE ....

Зачем много раз перезаписывать [R2]?
Может всё-таки: LDR R0,[R1],#4 / STR R0,[R2],#4 / SUBS R3,#1 ?
А ещё можно за проход сразу пачку регистров грузить или сохранять. Одной командой.
Go to the top of the page
 
+Quote Post
SII
сообщение Feb 15 2016, 23:38
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414



Цитата(jcxz @ Feb 16 2016, 02:01) *
Зачем много раз перезаписывать [R2]?


Задача толком не определена, поэтому набросан лишь примерный код, очерчивающий общую идею.

Цитата
Может всё-таки: LDR R0,[R1],#4 / STR R0,[R2],#4 / SUBS R3,#1 ?


Эти варианты LDR/STR отсутствуют в первой Тумбе, а значит, на Cortex-M0 использоваться не могут. На самом деле, если чтение и запись идут с одинаковым шагом (+4 в Вашем примере), можно сделать примерно так:

Код
LDR   R0, [R1, R3]
STR   R0, [R2, R3]
ADDS  R3, #4
BNE   ...


В данном случае надо в R1, R2 и R3 занести правильные начальные значения, которые удобны для машины, а не для человека. R3 должен быть таким, чтобы при достижении им нуля (через сложение, а не вычитание) цикл прекращался; по сути, он содержит число пересылаемых байтов со знаком минус. Соответственно, в R1 и R2 должны быть не базовые адреса массивов, а адреса первых байтов после массивов (поскольку при сложении R1/R2 и R3 итоговый адрес будет меньше, чем находящийся в R1/R2 -- ведь в R3 находится отрицательное число).

Или можно пересылать "задом наперёд", уменьшая счётчик -- это проще для понимания, но может не подходить в конкретном случае (вдруг массивы перекрываются в памяти, и пересылать надо именно двигаясь вперёд).

Цитата
А ещё можно за проход сразу пачку регистров грузить или сохранять. Одной командой.


Можно. Если надо переслать несколько слов (и всегда одно и то же количество), этот способ будет наиболее быстрым.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 20:03
Рейтинг@Mail.ru


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