|
Как разбить 2 байта по байту)) |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 24)
|
Oct 17 2008, 11:59
|
Частый гость
 
Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646

|
Цитата(Палыч @ Oct 17 2008, 15:29)  Например: unsigned int A; unsigned char b, c; b= A&0xFF; c= A>>8; A=(c<<8)|b;
или через union... У меня A становится просто b и все. Допустим A = 2008 после выполнения этого кода b = 216 c = 7 A = 216
|
|
|
|
|
Oct 17 2008, 12:09
|

Знающий
   
Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237

|
Цитата(Xenom0rph @ Oct 17 2008, 15:24)  Вообщем задача такая, у меня есть число типа unsigned int; Мне надо записать его в ячейку eeprom. Ячейка это один байт, значит для хранения типа unsigned int требуется две ячейки. Так вот как мне разбить это число по байту и записать в ячейки, а когда мне потребуется это число я его обратно склеил? Знаю, что как то делается это просто, там страший и младший разряд... и т.д. но вот что то немогу никак вьехать в эти разряды. Не нужно усложнять. eeprom с логической точки зрения ничем не отличается от "обычной" памяти. Поэтому и хранить там данные можно байтами, словами и целыми структурами. А о правильном расположении байтов пусть заботится компилятор. Код unsigned int __eeprom MyArray[10]; unsigned int A, B; ... MyArray[0] = A; // тут компилятор сам разложит переменную A побайтно и вставит инструкции побайтного сохранения в eeprom ... B = MyArray[0]; // тут будет проделана обратная работа. Примечание: в разных компиляторах квалификатор __eeprom может называться по-разному, но смысл тот же - указать компилятору, что память выделяется в зоне eeprom.
--------------------
Сделано в Китае. Упаковано в России.
|
|
|
|
|
Oct 17 2008, 12:54
|
Частый гость
 
Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646

|
Цитата(Палыч @ Oct 17 2008, 16:07)  Ошибочка вышла...
A=((unsigned int)c<<8) | b; 2Пылыч Спасибо. А по поводу прямо назначить область eeprom, что то не очень у меня это получаеться, компилятор CVAVR, там есть типо unsigned char eeprom a[10] только вот что то не заносит он туда ничего(( а пишет в data stack.
|
|
|
|
|
Oct 18 2008, 10:25
|
Частый гость
 
Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646

|
Цитата(DiMomite @ Oct 18 2008, 02:52)  В CVAVR надо писать так: eeprom unsigned char a[10]; Вот спасибо, "Век живи, век учись"
|
|
|
|
|
Oct 19 2008, 13:29
|
Местный
  
Группа: Новичок
Сообщений: 493
Регистрация: 18-06-06
Пользователь №: 18 143

|
Цитата(Палыч @ Oct 17 2008, 15:29)  или через union... Ну да. union LOG { unsigned char aa[2], unsigned int dd; }ff; unsigned char bb, сс; unsigned int big; dd.ff = big; bb = ff.aa[0]; cc = ff.aa[1]; Вроде бы так должно быть?
|
|
|
|
|
Oct 19 2008, 15:16
|

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

|
Цитата(lks @ Oct 19 2008, 15:29)  Вроде бы так должно быть?  Отнюдь  Цитата union LOG { unsigned char aa[2], unsigned int dd; }ff; int штука коварная и непереносимая в некоторых случаях. В Вашем случае 'unsigned short' И зачем делать union c обезличенным массивом  union my_short { unsigned short dd; unsigned char lo; unsigned char hi; } ff; И вообще, если не описывать union каждый раз, то typedef union my_short { unsigned short dd; unsigned char lo; unsigned char hi; } my_short_t; my_short_t ff; Цитата unsigned int big; unsigned short big; Цитата dd.ff = big; ff.dd = big; С точностью до наоборот. И вообще промежуточная переменная big просто лишняя - надо сразу использовать ff.dd Цитата bb = ff.aa[0]; cc = ff.aa[1]; bb = ff.lo; cc = ff.hi;
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 20 2008, 07:08
|

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

|
Цитата(zltigo @ Oct 19 2008, 18:16)  union my_short { unsigned short dd; unsigned char lo; unsigned char hi; } ff; Код union my_short { unsigned short dd; struct { unsigned char lo; unsigned char hi; }; } ff;
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 22 2008, 08:07
|
Группа: Новичок
Сообщений: 8
Регистрация: 17-10-08
Пользователь №: 41 022

|
__asm{ mov ax,[value] movzx ecx,al movzx edx,ah }
|
|
|
|
|
Oct 22 2008, 08:25
|

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

|
Цитата(g-gabber @ Oct 22 2008, 10:07)  __asm{ mov ax,[value] movzx ecx,al movzx edx,ah } К чему этот ASM i386 экзерсис, тем более, что разбивкой на БАЙТЫ тут и не пахнет?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 22 2008, 08:49
|
Группа: Новичок
Сообщений: 8
Регистрация: 17-10-08
Пользователь №: 41 022

|
Цитата(zltigo @ Oct 22 2008, 10:25)  К чему этот ASM i386 экзерсис, тем более, что разбивкой на БАЙТЫ тут и не пахнет? Упс, то что он под AVR пишет я не увидел, А вобще, под x86 это самый быстый способ разбрать 2 байтовый int по байтам.
|
|
|
|
|
Oct 22 2008, 18:18
|

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

|
Цитата(g-gabber @ Oct 22 2008, 10:49)  А вобще, под x86 это самый быстый способ разбрать 2 байтовый int по байтам. 1) в ASM ничего бить вообще не надо - все и так доступно, ибо система адресации позволяет произвольный доступ. 2)написанная ASM вставка есть вещь в себе и использовать ее из С вообще нельзя. 3) Это не для x86 а для 386, как минимум 4) int вообще-то на 386 не двухбайтовый 5) разбили не по байтам а по 32bit 6)movzx не эффективная по производительности команда, посему и насчет быстрый это не так.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 23 2008, 12:20
|
Группа: Новичок
Сообщений: 8
Регистрация: 17-10-08
Пользователь №: 41 022

|
Цитата(zltigo @ Oct 22 2008, 20:18)  1) в ASM ничего бить вообще не надо - все и так доступно, ибо система адресации позволяет произвольный доступ. 2)написанная ASM вставка есть вещь в себе и использовать ее из С вообще нельзя. 3) Это не для x86 а для 386, как минимум 4) int вообще-то на 386 не двухбайтовый 5) разбили не по байтам а по 32bit 6)movzx не эффективная по производительности команда, посему и насчет быстрый это не так. 1) То что ASM тут не любят я уже понял, 2) В теме нигде не написанно какой компилятор используется. 3) x86 для меня линейка процессоров, про < 386 я даже и не вспоминал, 4) Какого размера int зависит от компилятора и того как её задекларировать, Например VS C++ иногда использует int для храния 2 байт(16 бит), а long для 4 байт(32 бит), 5) Я тоже разбивал по 32 битным регистрам (ecx, edx). 6) А с этим я могу поспорить,,, movzx занимает 3 такта, значит Код movzx ecx,al movzx edx,ah займёт 6 тактов, Возьмём код который предложил Палыч. Код b= A&0xFF; c= A>>8; теперь переведём его в asm, получается следующее: Код mov ecx,eax; 1 такт and ecx.0xff; 1 такт mov edx,eax; 1 такт shl edx,8 ; 3 такт По сути получается одно и тоже, но у меня 2 команды, а тут 4, и не нужно забывать что процессору нужно на 2 команды больше обработать, Инофрмацию я брал от сюда http://www3.itu.edu.tr/~kesgin/mul06/intel/index.htmlЗа базу я брал 486, p.s. А вообще, давайте жить дружно!
Сообщение отредактировал g-gabber - Oct 23 2008, 12:23
|
|
|
|
|
Oct 23 2008, 20:31
|

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

|
Цитата(g-gabber @ Oct 23 2008, 14:20)  1) То что ASM тут не любят я уже понял, Совершенно не верно. Я люблю, и судя по Вашему экзерсизу, простите, знаю его много лучше. Не любю применение ASM ни к селу ни к городу особенно ввиде инлайновых вставок часто сносящих крышу оптимизатору. Цитата 2) В теме нигде не написанно какой компилятор используется. Достаточно того, что используется КОМПИЛЯТОРЦитата 3) x86 для меня линейка процессоров, про < 386 я даже и не вспоминал, Ну, ну... Цитата 4) Какого размера int зависит от компилятора и того как её задекларировать, Например VS C++ иногда использует int для храния 2 байт(16 бит), а long для 4 байт(32 бит), Глупости не надо говорить, поскольку "про < 386 я даже и не вспоминал". Цитата 6) А с этим я могу поспорить,,, movzx занимает 3 такта, значит Код movzx ecx,al movzx edx,ah займёт 6 тактов, А чего тут спорить, если xor edx,edx mov dl,ah короче на любезных Вашему сердцу пентиумах, не говоря уже о 386 с его 6 тактами на каждый movzx. Причем mov и xor на пентиумах конверизируются, а movzx - нет. Короче полный облом с попыткой писать на ASM  Цитата p.s. А вообще, давайте жить дружно! Легко  , если будете более обдуманно писать.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 23 2008, 21:30
|
Группа: Новичок
Сообщений: 8
Регистрация: 17-10-08
Пользователь №: 41 022

|
Цитата(zltigo @ Oct 23 2008, 22:31)  Совершенно не верно. Я люблю, и судя по Вашему экзерсизу, простите, знаю его много лучше. Не любю применение ASM ни к селу ни к городу особенно ввиде инлайновых вставок часто сносящих крышу оптимизатору. Достаточно того, что используется КОМПИЛЯТОРНу, ну... Глупости не надо говорить, поскольку "про < 386 я даже и не вспоминал". А чего тут спорить, если xor edx,edx mov dl,ah короче на любезных Вашему сердцу пентиумах, не говоря уже о 386 с его 6 тактами на каждый movzx. Причем mov и xor на пентиумах конверизируются, а movzx - нет. Короче полный облом с попыткой писать на ASM  Легко  , если будете более обдуманно писать. CPUID без инлайна не вывозишь. А вообще не хочу спорить ... уверен стажа у меня больше ... Лучше помогите мне настроить xds560 и OMAP ...
Сообщение отредактировал g-gabber - Oct 23 2008, 21:32
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|