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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> ARM Ассемблер, программирование-искусство?
Tarkus
сообщение Mar 5 2009, 10:21
Сообщение #1





Группа: Участник
Сообщений: 9
Регистрация: 22-02-09
Пользователь №: 45 211



Читал heyrick.co.uk, автор - апологет принципа "код - произведение искусства" smile.gif
Например, в одну инструкцию:

BIC R0, R0, R0, ASR#31 ; IF R0 < 0 THEN R0 = 0

Или еще лучше, таблица из "N" переходов с помощью всего двух инструкций:

.swihandler
CMP R11, #((endofjumptable - startofjumptable) / 4)
ADDCC PC, PC, R11, LSL #2
B error
.startofjumptable
B swi0
B swi1
; etc...
.endofjumptable

Честно говоря, не понял принципа работы второго примера. Кто-нибудь может прояснить?
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 5 2009, 10:49
Сообщение #2


;
******

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



Код
.swihandler

; На вход R11 - индекс в таблице переходов 0..макс. допустимый индекс


  CMP   R11, #((endofjumptable - startofjumptable) / 4);  проверили чтоб R11 < (макс.доп индекс + 1)
  ADDCC PC, PC, R11, LSL #2; и выполнили переход
  B     error; иначе перешли на обработку ошибки "недопустимый входной параметр"
.startofjumptable
B      swi0
B    swi1
; etc...
.endofjumptable

Где-то так. Сорри, форматтер кода - полный боян, такшта несколько нечитабельно
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 5 2009, 10:55
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Tarkus @ Mar 5 2009, 13:21) *
CMP R11, #((endofjumptable - startofjumptable) / 4)
ADDCC PC, PC, R11, LSL #2
B error
.startofjumptable
B swi0
B swi1
; etc...
.endofjumptable

Честно говоря, не понял принципа работы второго примера. Кто-нибудь может прояснить?

Неужели лень заглянуть в список инструкций ARM? Сравнение для того, чтобы R11 было меньше или равно размера таблицы. Если действительно меньше или равно, то прыгнуть на адрес PC+(4*R11), где PC указывает на "B swi0". В противном случае выполняется "B error".

Цитата(Tarkus @ Mar 5 2009, 13:21) *
Читал heyrick.co.uk, автор - апологет принципа "код - произведение искусства" smile.gif

Этот принцип для досужей потехи хорош, а для профессиональной деятельности крайне вреден. Если так ковыряться в инструкциях, то времени на работу не останется :-)
Go to the top of the page
 
+Quote Post
KRS
сообщение Mar 5 2009, 10:59
Сообщение #4


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



да в этих примерах ничего удивительного нет!
а таблицу переходов таким образом любой нромальный компилятор строит!
Так что если хотите посмотреть на особености ARM ассемблера, возьмите разные компиляторы:
IAR, GCC, RVCT (только свежие) поставьте максимальную оптимизацию по времени, потом по скорости и смотрите листинг увидите много хитрых приемов.
Современный ARM компилер трудно обогнать используя ассемблер, особенно при работе с константами - сидеть и вычислять чего куда сдвинуть и счем проксорить... (особенно если вы используете текстовое имя константы, а компилер то знает ее значение...)
В общем, очень мало место осталось где стоит применять ASM ( но знать его все равно полезно)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 5 2009, 11:04
Сообщение #5


;
******

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



Цитата(KRS @ Mar 5 2009, 13:59) *
Современный ARM компилер трудно обогнать используя ассемблер,


Это уж точно плюс пицот! Дык не все верят в очевидное sad.gif

Цитата
особенно при работе с константами - сидеть и вычислять чего куда сдвинуть и счем проксорить... (особенно если вы используете текстовое имя константы, а компилер то знает ее значение...)



А вот это, простите, не понял. Писанины больше получается - это факт, и выражений всяких поболее надо.
Go to the top of the page
 
+Quote Post
KRS
сообщение Mar 5 2009, 11:19
Сообщение #6


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(_Pasha @ Mar 5 2009, 14:04) *
А вот это, простите, не понял. Писанины больше получается - это факт, и выражений всяких поболее надо.

Например идет простая инициализация переферии.
т.е. надо по куче константных адресов записать константы.
Причем обычно константы представлены не числами, а символически (например не 0x12300 a ADC_REG_CTRL).
Так вот в силу специфики команд ARM не все контсатны можно оптимально загрузить в регистр, но зная их числовые представления и то что до этого было в регистрах можно получать их разными арифметическими и логическими действиями и компилер с этим прекрасно справляется, а вот руками упаришься считать. (типа что бы получиь константу DAC_INIT_1 = 0x48C04 можно (0x1233>>2)+4 а это одна команда для ARM)
Go to the top of the page
 
+Quote Post
Tarkus
сообщение Mar 5 2009, 11:23
Сообщение #7





Группа: Участник
Сообщений: 9
Регистрация: 22-02-09
Пользователь №: 45 211



Цитата(_Pasha @ Mar 5 2009, 12:49) *
.swihandler
ADDCC PC, PC, R11, LSL #2; и выполнили переход
Где-то так. Сорри, форматтер кода - полный боян, такшта несколько нечитабельно

Спасибо, действительно все прозрачно smile.gif
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 5 2009, 11:32
Сообщение #8


;
******

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



Цитата(KRS @ Mar 5 2009, 14:19) *
Так вот в силу специфики команд ARM не все контсатны можно оптимально загрузить в регистр

Да это понятно, обычно Peripheral-Specific макросы в помощь. Правда, я не особо широкого кругозора - дальше GNU AS не интересовался макросредствами для армов, но не сомневаюсь, что у всяких там кейлов с этим все в порядке

Цитата(Tarkus @ Mar 5 2009, 14:23) *
Спасибо

Пожалуйста
Go to the top of the page
 
+Quote Post
kons
сообщение Mar 8 2009, 07:00
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 106
Регистрация: 28-09-05
Пользователь №: 9 035



Цитата
Этот принцип для досужей потехи хорош, а для профессиональной деятельности крайне вреден. Если так ковыряться в инструкциях, то времени на работу не останется :-)

Немного не так. Если неохота ковыряться в инструкциях, надо пользоваться C. Например, обсуждаемая здесь инициализация периферии - уж точно не задача для asm. На таких задачах (как и на большинстве прочих), как верно отметил KRS,
Цитата
Современный ARM компилер трудно обогнать используя ассемблер

А вот написать какой-нибудь внутренний короткий цикл на asm (фильтр какой-нибудь или демодулятор) - это часто очень даже имеет смысл. И тут уж все средства хороши. Но (по опыту) максимальный эффект в asm-модуле достигается не жонглированияем битами, а оптимизацией доступа к памяти - использованием вместо кучи LDR/STR одной LDMIA/STMIA. Компилятор так не умеет (ну, кроме входа/выхода в процедуру есс-но). Для ядра ARM7TDMI на задачах типа свертки результат подобного подхода очень даже радует.
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Mar 8 2009, 13:53
Сообщение #10


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(kons @ Mar 8 2009, 02:00) *
Немного не так. Если неохота ковыряться в инструкциях, надо пользоваться C. Например, обсуждаемая здесь инициализация периферии - уж точно не задача для asm. На таких задачах (как и на большинстве прочих), как верно отметил KRS,
А вот написать какой-нибудь внутренний короткий цикл на asm (фильтр какой-нибудь или демодулятор) - это часто очень даже имеет смысл. И тут уж все средства хороши. Но (по опыту) максимальный эффект в asm-модуле достигается не жонглированияем битами, а оптимизацией доступа к памяти - использованием вместо кучи LDR/STR одной LDMIA/STMIA. Компилятор так не умеет (ну, кроме входа/выхода в процедуру есс-но). Для ядра ARM7TDMI на задачах типа свертки результат подобного подхода очень даже радует.

Грамотный ответ. Оптимизировать инициализацию переферии - оч глупо. Она выполняется один раз.
Оптимизировать цикл (на асм, по сравнению с С) думаю можно практически всегда, особенно если он написан на С человеком, который ассемблера в жизни не видел.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 8 2009, 14:00
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(ar__systems @ Mar 8 2009, 16:53) *
....если он написан на С человеком, который ассемблера C в жизни не видел.

smile.gif так правильно.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 9 2009, 10:50
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(ar__systems @ Mar 8 2009, 16:53) *
Оптимизировать цикл (на асм, по сравнению с С) думаю можно практически всегда

Зачем оптимизировать всегда? Я хотел донести такую мысль: не нужно оптимизировать, если и без оптимизации хорошо работает. Я думаю, бессмысленная оптимизация уносит слишком большое количество человеко-лет, которые могли бы быть потрачены более эффективно.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Mar 9 2009, 11:15
Сообщение #13


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

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



Почти в каждой современной книге по С/С++ написано о вреде преждевременной оптимизации и выстраивается последовательность:
1. Программирование алгоритма.
2. Отладка алгоритма и его комплексное тестирование.
3. Изучение быстродействия отдельных функций и модулей.
4. Оптимизация (при необходимости) узких мест.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 9 2009, 11:27
Сообщение #14


;
******

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



Цитата(sergeeff @ Mar 9 2009, 15:15) *
1. Программирование алгоритма.
2. Отладка алгоритма и его комплексное тестирование.
3. Изучение быстродействия отдельных функций и модулей.
4. Оптимизация (при необходимости) узких мест.

Это квадратные советы. Они не учитывают задачи портирования, коих большинство, когда об алгоритме уже известно почти все, надо чтобы оно красиво влезло и не мешало жить наращиваемой функциональности. В таких случаях я лично начинаю с проверки и оптимизации именно узких мест.
Go to the top of the page
 
+Quote Post
KRS
сообщение Mar 9 2009, 11:46
Сообщение #15


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(kons @ Mar 8 2009, 10:00) *
Но (по опыту) максимальный эффект в asm-модуле достигается не жонглированияем битами, а оптимизацией доступа к памяти - использованием вместо кучи LDR/STR одной LDMIA/STMIA. Компилятор так не умеет (ну, кроме входа/выхода в процедуру есс-но).

Иногда очень даже умеет! К тому же использование команд LDM STM не уменьшает количество досупов к памяти данных, а только за счет уменьшения инструкций уменьшается количество досупов к программе, а это не всегда приводит к увеличению быстродействия. И команды LDM STM увеличивают время реакции на прерывание, в RVCT есть даже опция на ограничение числа регистров в этой команде.
А вы можете привести конкретный пример цикла где действительно стоит использовать асм?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 14:31
Рейтинг@Mail.ru


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