|
ARM Ассемблер, программирование-искусство? |
|
|
|
Mar 5 2009, 10:21
|
Группа: Участник
Сообщений: 9
Регистрация: 22-02-09
Пользователь №: 45 211

|
Читал heyrick.co.uk, автор - апологет принципа "код - произведение искусства"  Например, в одну инструкцию: 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 Честно говоря, не понял принципа работы второго примера. Кто-нибудь может прояснить?
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Mar 5 2009, 10:55
|
Гуру
     
Группа: Свой
Сообщений: 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, автор - апологет принципа "код - произведение искусства"  Этот принцип для досужей потехи хорош, а для профессиональной деятельности крайне вреден. Если так ковыряться в инструкциях, то времени на работу не останется :-)
|
|
|
|
|
Mar 5 2009, 11:04
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(KRS @ Mar 5 2009, 13:59)  Современный ARM компилер трудно обогнать используя ассемблер, Это уж точно плюс пицот! Дык не все верят в очевидное  Цитата особенно при работе с константами - сидеть и вычислять чего куда сдвинуть и счем проксорить... (особенно если вы используете текстовое имя константы, а компилер то знает ее значение...) А вот это, простите, не понял. Писанины больше получается - это факт, и выражений всяких поболее надо.
|
|
|
|
|
Mar 5 2009, 11:19
|

Профессионал
    
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Mar 5 2009, 11:23
|
Группа: Участник
Сообщений: 9
Регистрация: 22-02-09
Пользователь №: 45 211

|
Цитата(_Pasha @ Mar 5 2009, 12:49)  .swihandler ADDCC PC, PC, R11, LSL #2; и выполнили переход Где-то так. Сорри, форматтер кода - полный боян, такшта несколько нечитабельно Спасибо, действительно все прозрачно
|
|
|
|
|
Mar 5 2009, 11:32
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(KRS @ Mar 5 2009, 14:19)  Так вот в силу специфики команд ARM не все контсатны можно оптимально загрузить в регистр Да это понятно, обычно Peripheral-Specific макросы в помощь. Правда, я не особо широкого кругозора - дальше GNU AS не интересовался макросредствами для армов, но не сомневаюсь, что у всяких там кейлов с этим все в порядке Цитата(Tarkus @ Mar 5 2009, 14:23)  Спасибо Пожалуйста
|
|
|
|
|
Mar 8 2009, 07:00
|
Частый гость
 
Группа: Свой
Сообщений: 106
Регистрация: 28-09-05
Пользователь №: 9 035

|
Цитата Этот принцип для досужей потехи хорош, а для профессиональной деятельности крайне вреден. Если так ковыряться в инструкциях, то времени на работу не останется :-) Немного не так. Если неохота ковыряться в инструкциях, надо пользоваться C. Например, обсуждаемая здесь инициализация периферии - уж точно не задача для asm. На таких задачах (как и на большинстве прочих), как верно отметил KRS, Цитата Современный ARM компилер трудно обогнать используя ассемблер А вот написать какой-нибудь внутренний короткий цикл на asm (фильтр какой-нибудь или демодулятор) - это часто очень даже имеет смысл. И тут уж все средства хороши. Но (по опыту) максимальный эффект в asm-модуле достигается не жонглированияем битами, а оптимизацией доступа к памяти - использованием вместо кучи LDR/STR одной LDMIA/STMIA. Компилятор так не умеет (ну, кроме входа/выхода в процедуру есс-но). Для ядра ARM7TDMI на задачах типа свертки результат подобного подхода очень даже радует.
|
|
|
|
|
Mar 8 2009, 13:53
|
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 на задачах типа свертки результат подобного подхода очень даже радует. Грамотный ответ. Оптимизировать инициализацию переферии - оч глупо. Она выполняется один раз. Оптимизировать цикл (на асм, по сравнению с С) думаю можно практически всегда, особенно если он написан на С человеком, который ассемблера в жизни не видел.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|