|
|
  |
swapb, переставить байты... |
|
|
|
Oct 19 2009, 15:09
|

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

|
Цитата(evgen2 @ Oct 19 2009, 16:48)  Так вот - вопрос - как делать это по быстрому и кошерно ? Код 20 __arm ulong htonl( ulong n ) 21 { 22 ulong tmp; 23 24 tmp = n ^ ( (n << 16) | (n >> 16) ); 25 tmp &= ~0x00FF0000; 26 n = ( n << 24 )|( n >> 8 ); 27 n ^= ( tmp >> 8 ); 28 29 return( n ); \ htonl: \ 00000000 601820E0 EOR R1,R0,R0, ROR #+16 \ 00000004 FF18C1E3 BIC R1,R1,#0xFF0000 \ 00000008 2114A0E1 LSR R1,R1,#+8 \ 0000000C 600421E0 EOR R0,R1,R0, ROR #+8 \ 00000010 0EF0A0E1 MOV PC,LR ;; return 30 } 16bit - и того проще.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 20 2009, 08:52
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Цитата(zltigo @ Oct 19 2009, 19:09)  16bit - и того проще. Т.е. как Keil в дефайне нарисовал - так и кузяво ? А некузявость только кажущаяся - главное не нахомутать с signed... ЗЫ: редиски, перенесли в помощь начинающему.  ЗЫЗЫ: а вот есть еще __packed. Толи он недавно появлся, толи не для всех процессоров, толи мне сильно везло...В факе и форумах оно если и упоминается, то вроде бы в основном в традиционном смысле pragma packed() Вот такой кусок кода может вести себя весьма нетрадиционным способом: Код char *MsgOut1, *MsgIn1; ..... MsgOut1[0] = MsgIn1[0]; MsgOut1[1] = MsgIn1[1]; MsgOut1[2] = MsgIn1[2]; MsgOut1[3] = MsgIn1[3];
Сообщение отредактировал evgen2 - Oct 20 2009, 09:04
|
|
|
|
|
Oct 20 2009, 09:10
|

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

|
Цитата(evgen2 @ Oct 20 2009, 11:52)  Т.е. как Keil в дефайне нарисовал - так и кузяво ? Зависит от контекста  . Если в отдельной функции (которую можно инлайнить), то есть нюансы по укладыванию в 3 команды. Можете потренироваться в понимании компилятора и ASM:) Цитата главное не нахомутать с signed... Что-то у Вас паронаидальные мысли какие-то.... Не демонизируйте signed - не при делах он. Цитата ЗЫ: редиски, перенесли в помощь начинающему.  На большее не тянет  Цитата(evgen2 @ Oct 20 2009, 11:52)  а вот есть еще __packed.... К чему это? Цитата Вот такой кусок кода может вести себя весьма нетрадиционным способом: Код char *MsgOut1, *MsgIn1; ..... MsgOut1[0] = MsgIn1[0]; MsgOut1[1] = MsgIn1[1]; MsgOut1[2] = MsgIn1[2]; MsgOut1[3] = MsgIn1[3]; 1. Не может 2. Дуболомный код  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 20 2009, 10:02
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Цитата(zltigo @ Oct 20 2009, 13:10)  1. Не может Я тоже так думал. Там еще было вот такое: Код char *pData;
MsgIn1 = (unsigned char *) pData+1; MsgOut1 = &SendDataBuffer[1]; В итоге один из указателей был четный, а другой нечетный. т.е. невыравненный. Цитата(zltigo @ Oct 20 2009, 13:10)  2. Дуболомный код  . этим и хорош. Далее идет долгий и нудный разбор принятого сообщения и конструирование ответа. Только про то, что +1 - это плохо не надо мне рассказывать. На самом деле я тут делаю на lpc2378 эмулятор работы связки двух процессоров (атмега+lpc2148, первый из которых ловит сообщение сверху и оправляет дальше без первого байта, а потом добавляет к ответу один байт)
|
|
|
|
|
Oct 20 2009, 19:52
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Цитата(zltigo @ Oct 20 2009, 14:12)  Дуболомство хорошим не бывает. По поводу указателей - тут ветка есть соседняя. бывает, бывает. Когда нужна максимальная читабельность кода, а на эффективность наплевать, и/или когда нужна максимальная портабельность ака "безобразно, но единообразно".
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|