Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2014.07.27;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.61 MB
Время: 0.014 c
15-1388575929
wl
2014-01-01 15:32
2014.07.27
вопрос про собеседание


15-1388649723
DevilDevil
2014-01-02 12:02
2014.07.27
ARM-ассемблер XE5


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


15-1388437065
wl
2013-12-31 00:57
2014.07.27
Москва, врачи lasik


15-1388477504
antonn
2013-12-31 12:11
2014.07.27
непонятная физика =)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский