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

 
 
 
Reply to this topicStart new topic
> Нужна помощь по С, SWAP на С
impuls-v
сообщение Jul 14 2006, 10:22
Сообщение #1


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

Группа: Свой
Сообщений: 130
Регистрация: 15-01-06
Пользователь №: 13 190



Можеть комунибудь покажется этот вопрос дибильным, но может кто знает.
Нужно сделать простейшую операцию - обмен нимблов т.е. ассемблерная команда swap.
Но вот в С++ я не нашел такой.
Вроде чего тут сложного сделал ассемблерную вставку, но нужно чтобы программы была универсальной, т.е. если сделать вставку swap r25? я не знаю может потом r25 окажется занятым переменной и все собъется.
Как сделать обмен нимблов на С, подскажите плиз.
Go to the top of the page
 
+Quote Post
Petka
сообщение Jul 14 2006, 10:25
Сообщение #2


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

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(impuls-v @ Jul 14 2006, 14:22) *
Можеть комунибудь покажется этот вопрос дибильным, но может кто знает.
Нужно сделать простейшую операцию - обмен нимблов т.е. ассемблерная команда swap.
Но вот в С++ я не нашел такой.
Вроде чего тут сложного сделал ассемблерную вставку, но нужно чтобы программы была универсальной, т.е. если сделать вставку swap r25? я не знаю может потом r25 окажется занятым переменной и все собъется.
Как сделать обмен нимблов на С, подскажите плиз.


c=(c>>4)|(c<<4);
Go to the top of the page
 
+Quote Post
impuls-v
сообщение Jul 14 2006, 11:13
Сообщение #3


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

Группа: Свой
Сообщений: 130
Регистрация: 15-01-06
Пользователь №: 13 190



Черт спасибо попробую.
Сначала была идея использовать>> но зациклился на том что
Цитата
При сдвиге влево правые освобождающиеся биты устанавливаются в нуль. При сдвиге вправо метод заполнения освобождающихся левых битов зависит от типа первого операнда.Если тип unsigned, то свободные левые биты устанавливаются в нуль. В противном случае они заполняются копией знакового бита.

И не подумал что можно сделать нужную операцию используя | и сдвиг влево и вправо.
Go to the top of the page
 
+Quote Post
otrog
сообщение Jul 14 2006, 11:20
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589



Цитата(Petka @ Jul 14 2006, 14:25) *
c=(c>>4)|(c<<4);

IAR компилирует вот во что:
Код
    120            i=(i>>4)|(i<<4);
   \   00000004   2F10               MOV     R17, R16
   \   00000006   9512               SWAP    R17
   \   00000008   701F               ANDI    R17, 0x0F
   \   0000000A   9502               SWAP    R16
   \   0000000C   7F00               ANDI    R16, 0xF0
   \   0000000E   2B01               OR      R16, R17
sad.gif


--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
Go to the top of the page
 
+Quote Post
unichorn
сообщение Jul 14 2006, 11:26
Сообщение #5


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

Группа: Участник
Сообщений: 96
Регистрация: 24-09-05
Пользователь №: 8 901



smile.gif
Ндааа. Дешевле ассемблерную вставку сделать.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jul 14 2006, 11:27
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(otrog @ Jul 14 2006, 14:20) *
Цитата(Petka @ Jul 14 2006, 14:25) *

c=(c>>4)|(c<<4);

IAR компилирует вот во что:
Код
    120            i=(i>>4)|(i<<4);
   \   00000004   2F10               MOV     R17, R16
   \   00000006   9512               SWAP    R17
   \   00000008   701F               ANDI    R17, 0x0F
   \   0000000A   9502               SWAP    R16
   \   0000000C   7F00               ANDI    R16, 0xF0
   \   0000000E   2B01               OR      R16, R17
sad.gif

Хм... Другой IAR компилирует SWAP
Go to the top of the page
 
+Quote Post
otrog
сообщение Jul 14 2006, 11:34
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589



Цитата(_Bill @ Jul 14 2006, 15:27) *
Хм... Другой IAR компилирует SWAP

Код
     34          unsigned int fu( unsigned int x )
   \                     fu:
     35          {
     36            return(( x &lt;&lt; 8 ) | ( x &gt;&gt; 8 ));
   \   000000   8C10         SWPB    R12
   \   000002   3041         RET
     37          }
     38

Дык то для MSP430 huh.gif


--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jul 14 2006, 11:35
Сообщение #8


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



В IAR есть такая функция
Код
__intrinsic unsigned char __swap_nibbles(unsigned char);

и не нужно к ассемблеру прибегать.
Надо включить файл inavr.h
Go to the top of the page
 
+Quote Post
impuls-v
сообщение Jul 14 2006, 11:37
Сообщение #9


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

Группа: Свой
Сообщений: 130
Регистрация: 15-01-06
Пользователь №: 13 190



Похоже эта темы вызвала обсуждение
Ассемблерная вставка дешевле если эта в ставка в вызываемой функции
Например
write(unsigned char data)
{
#asm
LD R30,Y
SWAP R30
ST Y,R30
#endasm
PORTB=data;
}
А в теле основной программы не дешевле.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jul 14 2006, 11:40
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(impuls-v @ Jul 14 2006, 14:37) *
Похоже эта темы вызвала обсуждение
Ассемблерная вставка дешевле если эта в ставка в вызываемой функции
Например
write(unsigned char data)
{
#asm
LD R30,Y
SWAP R30
ST Y,R30
#endasm
PORTB=data;
}
А в теле основной программы не дешевле.

Вообще, лучше вставками не пользоваться. Вставки не дают возможность компилятору оптимизировать код. Выигрывая в одном, Вы можете проиграть много больше в другом. Да и сама программа будет выглядеть коряво.
Go to the top of the page
 
+Quote Post
impuls-v
сообщение Jul 14 2006, 11:40
Сообщение #11


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

Группа: Свой
Сообщений: 130
Регистрация: 15-01-06
Пользователь №: 13 190



Вопервых откуда этот файл а во вторых нетрогать ассемблер, ассемблер это клёво.
Go to the top of the page
 
+Quote Post
otrog
сообщение Jul 14 2006, 11:42
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589



Цитата(IgorKossak @ Jul 14 2006, 15:35) *
В IAR есть такая функция
Код
__intrinsic unsigned char __swap_nibbles(unsigned char);

и не нужно к ассемблеру прибегать.
Надо включить файл inavr.h

Враво!!!
Код
    120            i = __swap_nibbles(i);  
   \   00000002   9502               SWAP    R16

PS ушел учить матчасть.


--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
Go to the top of the page
 
+Quote Post
impuls-v
сообщение Jul 14 2006, 11:43
Сообщение #13


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

Группа: Свой
Сообщений: 130
Регистрация: 15-01-06
Пользователь №: 13 190



Цитата
Вообще, лучше вставками не пользоваться. Вставки не дают возможность компилятору оптимизировать код. Выигрывая в одном, Вы можете проиграть много больше в другом. Да и сама программа будет выглядеть коряво.

НУ не знаю не знаю приведенный кусок уже оптимизирован.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jul 14 2006, 12:20
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(impuls-v @ Jul 14 2006, 14:43) *
Цитата
Вообще, лучше вставками не пользоваться. Вставки не дают возможность компилятору оптимизировать код. Выигрывая в одном, Вы можете проиграть много больше в другом. Да и сама программа будет выглядеть коряво.

НУ не знаю не знаю приведенный кусок уже оптимизирован.

Так в том-то и дело, что Вы привели фрагмент как раз без использования ассемблерной вставки. intrisic функция это не есть вставка. Вы дали возможность компилятору сделать свое дело, результат которого Вас устроил самым наилучшим образом.
Go to the top of the page
 
+Quote Post
Laksus
сообщение Jul 15 2006, 10:58
Сообщение #15


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

Группа: Участник
Сообщений: 146
Регистрация: 16-05-05
Пользователь №: 5 069



Цитата
Bill
...Вообще, лучше вставками не пользоваться. Вставки не дают возможность компилятору оптимизировать код.

Не могли бы Вы уточнить как не дают. Очень хорошо если бы
простейший пример.
_____________________________________
Вот тут попробовал в WinAVR20060421
unsigned char с1;
__________
Код
    c1 = PINC;
    asm ("swap %0" : "=r" (c1) : "0" (c1));
    PORTC = c1;
    asm("sleep");
********************************************
    c1 = PINC;
  72:    86 b1           in    r24, 0x06; 6
    asm ("swap %0" : "=r" (c1) : "0" (c1));
  74:    82 95           swap    r24
    PORTC = c1;
  76:    88 b9           out    0x08, r24; 8
    asm("sleep");

___________
а если c1 не используем и не применямем voletile
Код
    c1 = PINC;
    asm ("swap %0" : "=r" (c1) : "0" (c1));
    asm("sleep");
********************************************
    c1 = PINC;
  72:    86 b1           in    r24, 0x06; 6
    asm ("swap %0" : "=r" (c1) : "0" (c1));
    asm("sleep");
  74:    88 95           sleep

То есть, насколько я понимаю, оптимизация есть и с ассемблером.
____________
____________
А без ассемблера у меня получилось вот такой бред.
OPTIMIZE = -O3, без оптимизации еще хуже.
(WinAVR я только пытаюсь освоить, поэтому подозреваю что
сделал что-то не так):
Код
    c1 = PINC;
    c1 = (c1>>4)|(c1<<4);
    PORTC = c1;
    asm("sleep");
********************************************
    c1 = PINC;
  72:    26 b1           in    r18, 0x06; 6
    c1 = (c1>>4)|(c1<<4);
  74:    82 2f           mov    r24, r18
  76:    99 27           eor    r25, r25
  78:    82 95           swap    r24
  7a:    92 95           swap    r25
  7c:    90 7f           andi    r25, 0xF0; 240
  7e:    98 27           eor    r25, r24
  80:    80 7f           andi    r24, 0xF0; 240
  82:    98 27           eor    r25, r24
  84:    22 95           swap    r18
  86:    2f 70           andi    r18, 0x0F; 15
  88:    28 2b           or    r18, r24
    PORTC = c1;
  8a:    28 b9           out    0x08, r18; 8
    asm("sleep");
  8c:    88 95           sleep

__________
Александр
2006 07 15
Go to the top of the page
 
+Quote Post

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

 


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


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