Автор Тема: Тонкости программирования и использования AVR  (Прочитано 34507 раз)

0 Пользователей и 1 Гость просматривают эту тему.

pumpkin

  • Профи
  • ****
  • Сообщений: 240
  • Карма: 2
  • Пол: Мужской
  • Это Я :-)
    • Просмотр профиля
Вдобавок
z := rol(x,y) есть
z = x
ROTATE z, LEFT, y


z := x shl y есть
z = x
SHIFT z, LEFT, y


Цитировать
В баскоме нельзя делать такие длинные конструкции как
A = A +(((b Shl 4) + Rol(key[(sum Mod 4) + 4] , B)) Xor(d + Sum) Xor((b Shr 5) + Rol(key[sum Mod 4] , B Shr 27)));
Одна операция - одна строка. Тут вроде все понятно, кроме того что между математическими функщиямиXor нет математических знаков.)) Xor(d + Sum) Xor((b Shr 5) + Rol. Там умножение подрозумевается или как? 
xor - бинарная операция, типа Z = X xor Y, как и ("+","and" и тд) с приоритетом выше "+".
« Последнее редактирование: 25 Октября 2009, 06:54:14 от pumpkin »

pumpkin

  • Профи
  • ****
  • Сообщений: 240
  • Карма: 2
  • Пол: Мужской
  • Это Я :-)
    • Просмотр профиля
Будет примерно так (надеюсь нигде не ошибся):

\'имеем вначале
\'A = A +(((b Shl 4) + Rol(key[(sum Mod 4) + 4] , B)) Xor(d + Sum) Xor((b Shr 5) + Rol(key[sum Mod 4] , B Shr 27)));

x1 = b
SHIFT x1, LEFT, 4
x2 = sum MOD 4
x3 = b
SHIFT x3, RIGHT, 27
x4 = KEY(x2+4+1)
   \'в бейсике индексация с 1 !!!!!!!
ROTATE x4, LEFT, b
\'получаем
\'A = A +((x1 + x4) Xor(d + Sum) Xor((b Shr 5) + Rol(key[x2] , x3)));
\'идем дальше

x5 = KEY(x2+1)   \'в бейсике индексация с 1 !!!!!!!
ROTATE x5, LEFT, x3
x6 = b
SHIFT x6, RIGHT, 5
x7 = d + Sum

\'получаем
\'A = A +((x1 + x4) Xor x7 Xor (x6 + x5));
\'идем дальше

x1 = x1 + x4
x5 = x5 + x6

\'получаем
\'A = A +(x1 Xor x7 Xor x5);
\'идем дальше

x1 = x1 xor x7
x1 = x1 xor x5
A = A + x1


Andy

  • Администратор Форумa
  • Эксперт
  • *
  • Сообщений: 1803
  • Карма: 15
  • Пол: Мужской
  • Нельзя отремонтировать то, что не сломано...
    • minilabmaster
    • Просмотр профиля
    • Форум "Минилаб-Мастер"
Блин, все расжевал и в рот положил.... СПАСИБО!
Заклинило деталь - надави на нее, если она сломалась - ничего, ее все равно надо было менять.

pumpkin

  • Профи
  • ****
  • Сообщений: 240
  • Карма: 2
  • Пол: Мужской
  • Это Я :-)
    • Просмотр профиля
Рад помочь  :)

Andy

  • Администратор Форумa
  • Эксперт
  • *
  • Сообщений: 1803
  • Карма: 15
  • Пол: Мужской
  • Нельзя отремонтировать то, что не сломано...
    • minilabmaster
    • Просмотр профиля
    • Форум "Минилаб-Мастер"
Только там походу надо вместо
ROTATE x4, LEFT, b

надо
Dim X8 As Byte
X8 = Low(b)
Rotate X4 , Left , X8

Где

LOW
Action
Retrieves the least significant byte of a variable.
Syntax
var = LOW( s )
Remarks
Var
 The variable that is assigned with the LSB of var S.
S
 The source variable to get the LSB from.
You can also assign a byte to retrieve the LSB of a Word or Long.
For example :
B = L  , where B is a byte and L is a Long.

Заклинило деталь - надави на нее, если она сломалась - ничего, ее все равно надо было менять.

Форум проекта "Минилаб-Мастер"


pumpkin

  • Профи
  • ****
  • Сообщений: 240
  • Карма: 2
  • Пол: Мужской
  • Это Я :-)
    • Просмотр профиля
Ты совершенно прав. Упустил я этот момент. Исходный паскалевский
z := rol(x,y)
должен преобразовываться в конструкцию
z = x
Dim t As Byte
t = Low(y)
Rotate z , Left , t


В принципе, если оставить ROTATE x4, LEFT, b результат будет тот же. Но, если в старших байтах попадутся ненули и компилятор не умеет такие вещи оптимизировать, процессору придется проделать огромное количество лишних полных оборотов.

Andy

  • Администратор Форумa
  • Эксперт
  • *
  • Сообщений: 1803
  • Карма: 15
  • Пол: Мужской
  • Нельзя отремонтировать то, что не сломано...
    • minilabmaster
    • Просмотр профиля
    • Форум "Минилаб-Мастер"
Почти заработало, НО что означает конструкция

sum := sum + $9E3779B9;

не прибавить шестнадцатичеричное число же - переполнение возникает и алгоритм в разнос идет... ???
Заклинило деталь - надави на нее, если она сломалась - ничего, ее все равно надо было менять.

pumpkin

  • Профи
  • ****
  • Сообщений: 240
  • Карма: 2
  • Пол: Мужской
  • Это Я :-)
    • Просмотр профиля
Цитировать
Почти заработало, НО что означает конструкция

sum := sum + $9E3779B9;

не прибавить шестнадцатичеричное число же - переполнение возникает и алгоритм в разнос идет... ???
К sum прибавляется $9E3779B9, оно же 2654435769. Да, теоретически может возникнуть переполнение (то есть результат может быть быть больше $FFFFFFFF), но на самом деле процессор оставляет только младшие 32 бита результата. Математически это выглядит как sum := (sum + $9E3779B9) mod $FFFFFFFF.
Если твой процессор (AVR, или как там) так не делает, а происходит переполнение, то надо обходить, например сложив отдельно верхние и нижние WORD-ы. Например, для SUM := SUM + $9E3779B9 получится такая конструкция:

Dim SH, LH as Long
SH = HIGHW(SUM)    \'Старший Word от SUM
SUM = SUM And &HFFFF    \'Оставили младший Word в SUM
SUM = SUM + &H79B9     \'Складываем младшие
LH = HIGHW(SUM)       \'Извлекаем старший Word суммы младших
SUM = SUM And &HFFFF    \'Снова оставляем младший Word в SUM
SH = SH + LH + &H9E37          \'Сложили все старшие
SHIFT SH, LEFT, 16    \'Подвинули сумму старших на место (переполнившие биты ушли)
SUM = SUM + SH        \'Складываем старшие с младшими

Как-то так. Не факт, что оптимально.
« Последнее редактирование: 28 Октября 2009, 20:15:16 от pumpkin »

Andy

  • Администратор Форумa
  • Эксперт
  • *
  • Сообщений: 1803
  • Карма: 15
  • Пол: Мужской
  • Нельзя отремонтировать то, что не сломано...
    • minilabmaster
    • Просмотр профиля
    • Форум "Минилаб-Мастер"
ДА да да!

Первое же сложение выходит за пределы размера переменной и в результате какая-то фигня - отрицательные числа и прочее........ Видимо прогу переводили в делфи с си, а там вроде переменные автоматом расширяются до скольки надо.

А эта операция с 32 младшими битами обратима?
« Последнее редактирование: 29 Октября 2009, 02:16:03 от admin »
Заклинило деталь - надави на нее, если она сломалась - ничего, ее все равно надо было менять.

Andy

  • Администратор Форумa
  • Эксперт
  • *
  • Сообщений: 1803
  • Карма: 15
  • Пол: Мужской
  • Нельзя отремонтировать то, что не сломано...
    • minilabmaster
    • Просмотр профиля
    • Форум "Минилаб-Мастер"
Если обратима, чувствую можно упростить алгоритм серез одну 64-х разряжную промежуточную переменную.
Заклинило деталь - надави на нее, если она сломалась - ничего, ее все равно надо было менять.

Форум проекта "Минилаб-Мастер"


pumpkin

  • Профи
  • ****
  • Сообщений: 240
  • Карма: 2
  • Пол: Мужской
  • Это Я :-)
    • Просмотр профиля
В C-шном исходнике из википедии то же самое. Складываются два 32-битных беззнаковых числа (что Longword, что u32 принимают значения от 0 до 4294967295) и результат присваивается 32-битному беззнаковому числу, то есть отбираются младшие 32 байта, а старшие пропадают. Все это делает x86 процессор, выполняя код
    MOV EAX, sum
    ADD EAX, $9E3779B9
    MOV sum, EAX

Но так как при вычитании (sum := sum - $9E3779B9) оригинальное значение sum возвращается, то операция  обратима.

Если в басике есть 64-битные переменные то все еще проще (назовем 64-битный беззнаковый тип QWord-ом, допустим):
Dim Q as QWord
Q = sum + $9E3779B9
sum = Q and $FFFFFFFF
« Последнее редактирование: 29 Октября 2009, 05:27:31 от pumpkin »

Andy

  • Администратор Форумa
  • Эксперт
  • *
  • Сообщений: 1803
  • Карма: 15
  • Пол: Мужской
  • Нельзя отремонтировать то, что не сломано...
    • minilabmaster
    • Просмотр профиля
    • Форум "Минилаб-Мастер"
Цитировать
К sum прибавляется $9E3779B9, оно же 2654435769. Да, теоретически может возникнуть переполнение (то есть результат может быть быть больше $FFFFFFFF), но на самом деле процессор оставляет только младшие 32 бита результата. Математически это выглядит как sum := (sum + $9E3779B9) mod $FFFFFFFF.

А если вычитание?

Q = sum + $9E3779B9
sum = Q and $FFFFFFFF

Почему здесь and а там mod?  :-[

Интерестно, зачем вообще смысл этой дельты? Усиление книпто? Она может принимать любое значение?  с малыми ее значениями алгоритм прекрастно работает... Но bascom не переваривает переполнение..
Заклинило деталь - надави на нее, если она сломалась - ничего, ее все равно надо было менять.

Andy

  • Администратор Форумa
  • Эксперт
  • *
  • Сообщений: 1803
  • Карма: 15
  • Пол: Мужской
  • Нельзя отремонтировать то, что не сломано...
    • minilabmaster
    • Просмотр профиля
    • Форум "Минилаб-Мастер"
Все, разобрался.....

Вот готовый алгоритм, хоть сейчас в Википедию.  :)

Широкое поле для оптимизации. Пока отлаживалось только в симуляторе.

Цитировать
\' Код Pumpkin-Andy для BASCOM-AVR
\' Для шифрования-дешифрования по алгоритму XTEA 256 бит
\' Блоками по 4 байта
\' http://minilabmaster.com/cgi-bin/yabb2/YaBB.pl?num=1252818839/30

$crystal = 10000000
$regfile = "m32def.dat"

Dim Plain(4) As Long
Dim Key(8) As Long
Const Iterations = 32
Dim Iterations2 As Byte

Dim X1 As Long
Dim X2 As Long
Dim X3 As Long
Dim X4 As Long
Dim X5 As Long

\'--------------------------------------------
Dim A As Long
Dim B As Long
Dim C As Long
Dim D As Long
Dim Sum As Long
Dim R As Long
Dim T As Long
Dim Delta As Double

Const Delta = &H51EB850

Plain(1) = 174
Plain(2) = 175
Plain(3) = 176
Plain(4) = 177

Key(1) = &HFAAAAAAA
Key(2) = &HBBBBBBBB
Key(3) = &HCCCCCCCC
Key(4) = &HDDDDDDDD
Key(5) = &HEEEEEEEE
Key(6) = &HFFFFFFFF
Key(7) = &H11111111
Key(8) = &H22222222

Gosub Crypt

Gosub Decrypt

For A = 1 To 4
B = Plain(a)
Print B
Next




Crypt:

   Sum = 0
    A = Plain(1) + Key(1)
    B = Plain(2) + Key(2)
    C = Plain(3) + Key(3)
    D = Plain(4) + Key(4)
Iterations2 = Iterations - 1

For R = 0 To Iterations2

 X1 = B
 Shift X1 , Left , 4
 X2 = Sum Mod 4
 X2 = Key(x2 + 5)
 X3 = B
 X4 = Low(b)
 Rotate X2 , Left , X4
 X1 = X1 + X2
 X2 = D + Sum
 X1 = X1 Xor X2

X2 = B
 Shift X2 , Right , 5
X3 = Sum Mod 4
X3 = Key(x3 + 1)
 X4 = B
 Shift X4 , Right , 27
 X5 = Low(x4)
 Rotate X3 , Left , X5
 X2 = X2 + X3
 X1 = X1 Xor X2
 A = A + X1

 Sum = Sum + Delta

X1 = D
Shift X1 , Left , 4
X2 = Sum
Shift X2 , Right , 11
X2 = X2 Mod 4
X2 = X2 + 5
X2 = Key(x2)
X3 = Low(d)
Rotate X2 , Left , X3
X1 = X1 + X2

X2 = B + Sum
X1 = X1 Xor X2

X2 = D
Shift X2 , Right , 5
X3 = Sum
Shift X3 , Right , 11
X3 = X3 Mod 4
X3 = X3 + 1
X3 = Key(x3)
X4 = D
Shift X4 , Right , 27
X4 = Low(x4)
Rotate X3 , Left , X4
X2 = X2 + X3
X1 = X1 Xor X2
C = C + X1

      T = A
      A = B
      B = C
      C = D
      D = T

Next

    Plain(1) = A Xor Key(5)
    Plain(2) = B Xor Key(6)
    Plain(3) = C Xor Key(7)
    Plain(4) = D Xor Key(8)

Return



Decrypt:

Sum = 0
   Gosub Slog

    D = Plain(4) Xor Key(8)
    C = Plain(3) Xor Key(7)
    B = Plain(2) Xor Key(6)
    A = Plain(1) Xor Key(5)
Iterations2 = Iterations - 1

For R = Iterations2 To 0 Step -1

      T = D
      D = C
      C = B
      B = A
      A = T

X1 = D
Shift X1 , Left , 4
X2 = Sum
Shift X2 , Right , 11
X2 = X2 Mod 4
X2 = X2 + 5
X2 = Key(x2)
X3 = Low(d)
Rotate X2 , Left , X3
X1 = X1 + X2

X2 = B + Sum
X1 = X1 Xor X2

X2 = D
Shift X2 , Right , 5
X3 = Sum
Shift X3 , Right , 11
X3 = X3 Mod 4
X3 = X3 + 1
X3 = Key(x3)
X4 = D
Shift X4 , Right , 27
X4 = Low(x4)
Rotate X3 , Left , X4
X2 = X2 + X3
X1 = X1 Xor X2
C = C - X1

Sum = Sum - Delta

X1 = B
Shift X1 , Left , 4
X2 = Sum
X2 = X2 Mod 4
X2 = X2 + 5
X2 = Key(x2)
X3 = Low(b)
Rotate X2 , Left , X3
X1 = X1 + X2

X2 = D + Sum
X1 = X1 Xor X2

X2 = B
Shift X2 , Right , 5
X3 = Sum Mod 4
X3 = X3 + 1
X3 = Key(x3)
X4 = B
Shift X4 , Right , 27
X4 = Low(x4)
Rotate X3 , Left , X4
X2 = X2 + X3
X1 = X1 Xor X2

A = A - X1

Next

    Plain(4) = D - Key(4)
    Plain(3) = C - Key(3)
    Plain(2) = B - Key(2)
    Plain(1) = A - Key(1)
 Return


Slog:
For Z = 1 To 32
Sum = Sum + Delta
Next
Return

End

End
« Последнее редактирование: 12 Ноября 2009, 15:37:33 от admin »
Заклинило деталь - надави на нее, если она сломалась - ничего, ее все равно надо было менять.

pumpkin

  • Профи
  • ****
  • Сообщений: 240
  • Карма: 2
  • Пол: Мужской
  • Это Я :-)
    • Просмотр профиля
@ Andy, спасибо. Бум стараться :)

Andy

  • Администратор Форумa
  • Эксперт
  • *
  • Сообщений: 1803
  • Карма: 15
  • Пол: Мужской
  • Нельзя отремонтировать то, что не сломано...
    • minilabmaster
    • Просмотр профиля
    • Форум "Минилаб-Мастер"
Блин, на рекльных ключах 8-ми разрядной длины алгорити глючит... И вроде бы процессор реально оставляет младшие 8 разрядов. НО

вот код:
Dim A As Long
Dim Delta As Double
Dim Key(8) As Long
Key(1) = &HAAAAAAAA
Key(2) = &HBBBBBBB1

A = Key(1)+ Key(2)
Printbin A
Wait 1
Delta = Key(1) + Key(2)
A = Delta And &HFFFFFFFF
Printbin A
Wait 1
Print "ok"

Результат одинаков -     5B 66 66 66      (почему-то разряды задои наперед)

Но если при простом сложении алгоритм глючил a=a+большое число
а через большую переменую работал нормально
где b= a+большое число
  A = b And &HFFFFFFFF   

Дюдя в растерянности... Завтра продолжу эксперименты...                   
Заклинило деталь - надави на нее, если она сломалась - ничего, ее все равно надо было менять.

Форум проекта "Минилаб-Мастер"