Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.07.27;
Скачать: CL | DM;

Вниз

ARM-ассемблер XE5   Найти похожие ветки 

 
Rouse_ ©   (2014-01-04 18:03) [40]


> Германн ©   (03.01.14 02:29) [36]
> 9КБ это же до х** и больше. Или я что-то не понимаю?

Вероятно не понимаешь, ибо обычный MD5 занимает в районе 10 кб, а тут цельный AES


 
DevilDevil ©   (2014-01-04 18:07) [41]

> Kerk ©   (04.01.14 17:09) [39]

Хууухх, смотрите-ка
Действительно получается, что кодогенерация идёт в Thumb-2: команды двухбайтные или четырёхбайтные

Спасибо!

Только вот понять не могу, почему команд столько много... Это же вроде LLVM, там нормальная оптимизация должна быть... Посмотри для сравнения [24]


 
DVM ©   (2014-01-04 18:18) [42]


> Rouse_ ©   (04.01.14 18:03) [40]


> ибо обычный MD5 занимает в районе 10 кб, а тут цельный AES

AES занимает не сильно больше, но там 5 таблиц по 256 байт - уже больше килобайта, а так то алгоритм не сложный, визуально проще чем MD5.


 
RWolf ©   (2014-01-04 18:25) [43]


>  [40]

и как только у меня в бутлодере AES всего в килобайт умещается.


 
Rouse_ ©   (2014-01-04 21:09) [44]


> RWolf ©   (04.01.14 18:25) [43]
> и как только у меня в бутлодере AES всего в килобайт умещается.

К этому и иду :)


 
RWolf ©   (2014-01-04 22:07) [45]


>  [44]

так оно без особенных стараний так вышло, взял на atmel.com код из одноимённой аппноты для AVR и пересобрал под ARM.


 
bems ©   (2014-01-04 22:53) [46]


> AES занимает не сильно больше, но там 5 таблиц по 256 байт

с-боксы не обязательно хранить в табличном виде, можно генерить нужный элемент по необходимости


 
DVM ©   (2014-01-05 01:14) [47]


> bems ©   (04.01.14 22:53) [46]

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


 
Inovet ©   (2014-01-05 01:43) [48]

> [37] DevilDevil ©   (03.01.14 22:59)
> Прыжки

Почему прыжки? Всё-таки их как-то принято называть переходами.


 
DevilDevil ©   (2014-01-05 02:50) [49]

> Inovet ©   (05.01.14 01:43) [48]

потому что я знаю как переводится "Jump"
и "прыжок" подходит по смыслу значительно больше, чем "переход"


 
Германн ©   (2014-01-05 03:03) [50]


> Rouse_ ©   (04.01.14 18:03) [40]
>
>
> > Германн ©   (03.01.14 02:29) [36]
> > 9КБ это же до х** и больше. Или я что-то не понимаю?
>
> Вероятно не понимаешь, ибо обычный MD5 занимает в районе
> 10 кб, а тут цельный AES

На каком языке "обычный MD5" занимает 10 КБ?
И для какого процессора?
И как эта процедура реализована?

P.S. Имхо 9КБ программной памяти для микропроцессора это не скажу что офигенное количество памяти, но скажу что весьма немалое. Даже на 8-ми битном процессоре можно наваять весьма сложные алгоритмы.


 
Inovet ©   (2014-01-05 11:40) [51]

> [49] DevilDevil ©   (05.01.14 02:50)
> потому что я знаю как переводится «Jump»
> и «прыжок» подходит по смыслу значительно больше, чем «переход»

Я тоже знаю перевод, а насчёт смысла вопрос вкусовщины и в немалой степени традиции, во всяком случае прыжок по-русски режет ухо.


 
DevilDevil ©   (2014-01-05 13:49) [52]

> Inovet ©   (05.01.14 11:40) [51]

мне "переход" режет ухо. мне очень даже не режет слух "прыжок"


 
Kerk ©   (2014-01-05 13:59) [53]

Ну раз уж Inovet поднял тему... А что теперь вместо, например, фраз "условный переход" и "безусловный переход" модно говорить "условный прыжок" и "безусловный прыжок"? Насчет ушей Inovet прав, имхо.


 
Rouse_ ©   (2014-01-05 14:45) [54]


> Германн ©   (05.01.14 03:03) [50]
> На каком языке "обычный MD5" занимает 10 КБ?

Дык на твоей родной дельфе, зря ты вчера не приехал на шашлыки к нам в офис, я там Зотычу это дело наглядно демонстрировал, и IDA и ключик и размер по которому я утыкаюсь :)


> DevilDevil ©   (05.01.14 13:49) [52]
> мне "переход" режет ухо. мне очень даже не режет слух "прыжок"

Это то-же что и с нить/поток (Thread/Stream) так уж исторически сложилось.
Правда хоть я и придерживаюсь терминологии Нить в отношении TThread, иснстукции JXX все-же называю переходами (ибо Керк правильно сказал, "условный прыжок" как-то режет слух)


 
Inovet ©   (2014-01-05 17:05) [55]

Предлагаю на печатных платах «джамперы» переводить как прыжки. Например «jumper-free» переводить «свободная от прыгунов», а то «без перемычек» как-то несовременно звучит.


 
Rouse_ ©   (2014-01-05 17:55) [56]


> RWolf ©   (04.01.14 22:07) [45]
>
> >  [44]
>
> так оно без особенных стараний так вышло, взял на atmel.
> com код из одноимённой аппноты для AVR и пересобрал под
> ARM.

Чет не получилось, вышел на 9 082, мошт что с настройками не так. Ты как собирал?


 
RWolf ©   (2014-01-05 18:03) [57]


> Rouse_ ©   (05.01.14 17:55) [56]

aes.lst:
IAR ANSI C/C++ Compiler V6.40.4.54170/W32 for ARM     22/Feb/2013  17:29:45
Copyright 1999-2012 IAR Systems AB.                                        
                                                                           
  Cpu mode     =  thumb                                                    
  Endian       =  little                                                  
  Source file  =  C:\xxx\Src\aes.cpp                
  Command line =  C:\xxx\Src\aes.cpp -lCN            
                  C:\xxx\IAR\Release\List\ -lB      
                  C:\xxx\IAR\Release\List\ -o        
                  C:\xxx\IAR\Release\Obj\ --debug --endian=little --cpu=Cortex-M3 -e --fpu=None --dlib_config "C:\Program Files\IAR\EW6\arm\INC\c\DLib_Config_Normal.h" -I C:\xxx\IAR\..\S rc\ -I C:\xxx\IAR\..\..\Src\ -I C:\xxx\IAR\..\..\..\Inc\ -Ohz --eec++                                                  
  List file    =  C:\xxx\IAR\Release\List\aes.lst    
  Object file  =  C:\xxx\IAR\Release\Obj\aes.o      

  ...

  Section sizes:

  Bytes  Function/Label
  -----  --------------
      4  ?<Constant {(byte)"\001", (byte)"\000", (byte)
      4  ??DataTable5
      4  ??DataTable5_1
      4  ??DataTable5_2
      8  ?Subroutine0
     14  CopyBytes(byte *, byte *, unsigned int)
    366  InvMixColumn(byte *)
     50  InvShiftRows(byte *)
     24  InvSubBytesAndXOR(byte *, byte *, unsigned int)
    194  KeyExpansion(byte *)
     20  SubBytes(byte *, unsigned int)
     20  XORBytes(byte *, byte *, unsigned int)
    118  aesDecrypt(unsigned char *, unsigned char *)
    154  aesInit(unsigned char *)
    268  block1
         powTbl
         logTbl
         sBoxInv
    256  block2
     32  kTable
      8  sBox
         expandedKey


  532 bytes in section .bss
1 016 bytes in section .text


 
Rouse_ ©   (2014-01-05 18:07) [58]


> RWolf ©   (05.01.14 18:03) [57]

Угу, принял - спасибо...


 
DevilDevil ©   (2014-01-05 18:08) [59]

http://upload.wikimedia.org/wikipedia/commons/d/d7/О.п._Кавголово._Подземный_переход.JPG


 
Rouse_ ©   (2014-01-05 18:09) [60]

Эмнь... А вот тут просадки рзве не будет? "--fpu=None"


 
RWolf ©   (2014-01-05 18:20) [61]


> Rouse_ ©   (05.01.14 18:09) [60]

я для Cortex-M3 пишу, она без FPU.
да и алгоритм целочисленный.


 
Inovet ©   (2014-01-05 18:22) [62]

> [59] DevilDevil ©   (05.01.14 18:08)
> http://upload.wikimedia.org/wikipedia/commons/d/d7/О.п._Кавголово._Подземный_переход.JPG

Ну что, тунельные переходы весьма достойны, даже чем-то могут показаться мистичны, и казались таковыми не так давно &#151; невозможно пройти, а вот раз и прошёл.


 
Rouse_ ©   (2014-01-05 18:33) [63]


> RWolf ©   (05.01.14 18:20) [61]
>
> > Rouse_ ©   (05.01.14 18:09) [60]
>
> я для Cortex-M3 пишу, она без FPU.
> да и алгоритм целочисленный.

Ага, понятно, еще раз сеньк, покумекаю...


 
Rouse_ ©   (2014-01-05 18:41) [64]


> RWolf ©   (05.01.14 18:20) [61]

Небольшой вопрос, а можно чуть попозже я у тебя пару консультаций возьму (если возникнут затруднения) и, конечно, платные. (За знания нужно всегда платить звонкой монетой :)


 
DevilDevil ©   (2014-01-05 18:48) [65]

> а вот раз и прошёл.

это к вопросу "переходов"
мож конечно в русскоязычной литературе устоялся термин "условный переход"
но для меня "переход" термин неверный. верный - "прыжок"
в общем мы оба правы. только я правее

а вообще я пишу(ал) обычно jmp/jcc - и всё автоматически становилось понятно


 
DevilDevil ©   (2014-01-05 18:51) [66]

"прыжки" режут у вас ухо
а "переход" режет мою логику и воображение. Это как медиков педиками назвать, а продавцов дисков на рынке назвать программистами


 
RWolf ©   (2014-01-05 19:04) [67]


> [64]

стучись в джаббер r-wolf на ya.ru.


 
DevilDevil ©   (2014-01-06 00:14) [68]

В общем посоветовали мне вот этот справочник: http://lcs3.syr.edu/faculty/yin/teaching/CIS700-sp11/arm_architecture_reference_manual_errata_markup_8_0.pdf
Особенно обратите внимание на раздел A8.6.16
Пришли к выводу, что ЯВУ компилирует в режиме Thumb. Часть команд 16-битные, часть 32-битные
В справочнике нужно смотреть на варианты "Encoding T..." и полностью игнорировать "Encoding A..."


 
DevilDevil ©   (2014-01-06 00:15) [69]

Теперь вернёмся к моей текущей задаче

В конечном счёте есть последовательность команд, некоторые из них прыжки. Каждая команда имеет размер. Поначалу все прыжки инициализируются как большие. Т.е. call 5 байт, jmp 5 байт, jcc 6 байт. Все ARM прыжки (бранчи) инициализируются 4 байтами. По идее должно хватить и длинного прыжка, но в крайнем случае можно будет 4х-байтной командой командой напрямую загрузить pc из участка памяти.

Ну так вот. Один из этапов моей либы - это сжатие прыжков. И я хочу сделать универсальный подход для платформ x86, x64 и ARMv7, ну как минимум само сжатие больших прыжков к малым. Определён тип condition и по каждому условию будет какая-то информационная структура. В итоге получится таблица.

Что я хотел бы вас попросить мне помочь. Сконцентрируемся на задаче (опишу сильно упрощено, но смысл сохраняется):
Есть команда-прыжок. Я знаю её смещение относительно начала функции. У меня есть condition (тип) прыжка. Я знаю на сколько байт (от начала команды) должен быть совершён прыжок. Задача - определить, можно ли "сжать" прыжок. И если да - то каким образом прописать смещение в результирующую бинарную команду.

Вот в x86-64 все просто.
call не сжимаются
диапазон для jcc: -126..131.    signed char offset = (OFFSET<0)?OFFSET+2:OFFSET-4; // было 6, стало 2
диапазон для jmp: -126..130.    signed char offset = (OFFSET<0)?OFFSET+2:OFFSET-3; // было 5, стало 2


А для ARMv7 пока понять не могу. Просьба помочь
Ситуация усложняется тем, что у меня нет компилятора-дебагера, и сейчас я не смогу проверить догадку, кроме как на примере функции выше


 
DevilDevil ©   (2014-01-06 00:32) [70]

очепяточка

диапазон для jcc: -126..131    signed char offset = (OFFSET<0)?OFFSET-2:OFFSET-4; // было 6, стало 2
диапазон для jmp: -126..130    signed char offset = (OFFSET<0)?OFFSET-2:OFFSET-3; // было 5, стало 2


 
DevilDevil ©   (2014-01-06 15:32) [71]

В общем с учётом полученных знаний об архитектуре ARM получилось определить следующую формулу.

диапазон для b<c>: -252..260    signed char offset = ((OFFSET<0)?OFFSET-4:OFFSET-4-2) >> 1;

И для прыжка на положительное смещение вроде бы подходит
Смотрим пример RWolf ©   (02.01.14 21:25) [24]

BGE происходит из 6 в 14 (E). Если бы прыжок был большим - то из 6 в 16, OFFSET = 10
offset = (10-4-2) >> 1 = 2. Верно

Давайте постараемся проверить корректность для прыжка на отрицательное расстояние.
RWolf, Kerk, не могли бы вы привести листинг какого-нибудь цикла с постусловием ?



Страницы: 1 2 вся ветка

Текущий архив: 2014.07.27;
Скачать: CL | DM;

Наверх




Память: 0.62 MB
Время: 0.01 c
15-1388242644
turbouser
2013-12-28 18:57
2014.07.27
есть работа :)


2-1379126076
Vervolfe
2013-09-14 06:34
2014.07.27
Прошу помощи по сохранению TreeView


15-1387640432
wl
2013-12-21 19:40
2014.07.27
Облака... белогри...


15-1388738179
XCoder
2014-01-03 12:36
2014.07.27
Delphi стремительно сдает позиции


15-1386694836
Rouse_
2013-12-10 21:00
2014.07.27
О пользе домашней еды :)