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

Вниз

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

 
DevilDevil ©   (2014-01-02 12:02) [0]

Позволяет ли XE5 писать на ассемблере под ARM-архитектуру ?
Имеется ли возможность в отладчике смотреть последовательность сгенерированных ARM-команд из ЯВУ ?
Имеется ли возможность всё это делать, за PC, не используя дополнительные девайсы ?


 
DVM ©   (2014-01-02 14:11) [1]


> DevilDevil ©   (02.01.14 12:02) 
> Позволяет ли XE5 писать на ассемблере под ARM-архитектуру
> ?

Нельзя.


 
DevilDevil ©   (2014-01-02 15:53) [2]

у меня нет ни ARM-дивайсов, нет ARM-компилятора
делаю что-то типа ассемблерного компилятора, под x86-x64-ARM
и на данный момент пытаюсь определить, каким образом запрограммировать оптимизацию и реализацию прыжков, чтобы потом можно было припаять ARM, не перекраивая архитектуру.

Русскоязычной литературы мало, читаю Т.Мартин "Микроконтроллеры ARM7...", но там по ассемблеру мало. В англоязычных источниках много непонятных слов :). К тому же важно учитывать, что технологии и подходы движутся, мне интересен актуальный ARM-ассемблер для айфонов, айпадов и андроидов.

Не мог бы ты ответить сам (если можешь) или может спросить у кого...
- как реализуется call/ret (вызов/возврат) функции
- применимы ли короткие/длинные прыжки? (логика подсказывает, что смотреть надо надо на Thumb-2, но опять таки не известно, как он применяется на практике)
- как осуществляются прыжки на расстояние свыше 24Мб


 
RWolf ©   (2014-01-02 16:10) [3]

имхо, если уж взялся за компилятор под архитектуру, таких вопросов возникать не должно.
в документации на arm.com всё есть.


 
Rouse_ ©   (2014-01-02 16:13) [4]


> DevilDevil ©   (02.01.14 15:53) [2]

Родную документацию, конечно смотрел?
http://infocenter.arm.com/help/topic/com.arm.doc.dui0068b/DUI0068.pdf


 
DevilDevil ©   (2014-01-02 16:18) [5]

> RWolf ©   (02.01.14 16:10) [3]
> имхо, если уж взялся за компилятор под архитектуру, таких
> вопросов возникать не должно.в документации на arm.com всё есть.


Для ARM я буду делать ещё не известно когда. Сейчас мучаю оптимизацию/реализацию прыжков для x86-x64. Но сдаётся мне, можно сделать универсальный подход. Вот поэтому и интересуюсь


 
DevilDevil ©   (2014-01-02 16:23) [6]

> Rouse_ ©   (02.01.14 16:13) [4]

Вопрос больше не об ARM в общем, а об ARM в Delphi.
ARM поддерживает Jazzele, но в Delphi-то его нет


 
Rouse_ ©   (2014-01-02 16:26) [7]

Дельфя компилит код в LLVM, собственно это тебе и ответ на вопрос. LLVM конечно позволяет использовать асм вставки но не в том виде в котором ты привык. А родной арм код получается только вторым проходом из LLVM.


 
RWolf ©   (2014-01-02 16:26) [8]

для начала, единой архитектуры ARM нет, а есть архитектуры v4, v4T с Thumb, v5, v6, v7 с Thumb-2, v8 с 64-бит набором, и все более-менее в ходу, и кодогенерация в них существенно отличается.


 
Rouse_ ©   (2014-01-02 16:27) [9]

Да и кстати, из какого ЯВУ ты компилятор делаеш-то?


 
DevilDevil ©   (2014-01-02 16:36) [10]

> Rouse_ ©   (02.01.14 16:27) [9]
> Да и кстати, из какого ЯВУ ты компилятор делаеш-то?


Ты неправильно понял. Смысл этого всего будет понятен, когда наконец выйдет ApolloXML
В данном случае, если XE5 позволяет смотреть сгенерированные ассемблерные команды (Ctrl+C), то на вопросы выше можно ответить


 
DevilDevil ©   (2014-01-02 16:40) [11]

> RWolf ©   (02.01.14 16:26) [8]

а XE5 под какой процессор компилирует ?


 
DevilDevil ©   (2014-01-02 16:40) [12]

* под какую версию ARM


 
Rouse_ ©   (2014-01-02 16:57) [13]


> DevilDevil ©   (02.01.14 16:40) [12]
> * под какую версию ARM

AFAIK сейчас ARMv7


 
DevilDevil ©   (2014-01-02 17:05) [14]

Получается нужно найти того, у кого есть XE5
И попросить его внести больше ясности :)


 
Rouse_ ©   (2014-01-02 18:17) [15]

Не просто ХЕ5, а с возможностью такой разработки. Там одна из дорогих версий пакета такое умеет делать. Проф точно не умеет. Хотя, впрочем, у Керка точно есть какая нужна (MVP все-же) можешь его попинать и он даже должен (ес я не ошибаюсь) тебе такие моменты разьяснить :)


 
DevilDevil ©   (2014-01-02 18:48) [16]

> Rouse_ ©   (02.01.14 18:17) [15]

Ну пинать я никого не буду :)
У нас вроде как сообщество программистов. Увидит, будет желание внести ясность - ради бога. Нет - так чё человека заставлять :)


 
Kerk ©   (2014-01-02 19:08) [17]

В интернетах пишут, что ARM v7.

В самой XE5 я могу легко посмотреть, если мне скажете куда смотреть. Компилятор называется dccarm.exe, как узнать о нем больше информации, я сходу не понял :)

Если есть желание самому попробовать XE5, то можно смело брать триальную версию. Триал представляет собой САМУЮ полную версию Delphi (Architect вроде), но без исходников и с ограничением по времени конечно же.


 
DevilDevil ©   (2014-01-02 19:16) [18]

> Если есть желание самому попробовать XE5, то можно смело
> брать триальную версию. Триал представляет собой САМУЮ полную
> версию Delphi (Architect вроде), но без исходников и с ограничением
> по времени конечно же.


Боюсь мой древний комп не потянет пятую версию. На работу ещё выходить не скоро, к тому же там свои траблы будут

> В интернетах пишут, что ARM v7.

ясно

> В самой XE5 я могу легко посмотреть, если мне скажете куда
> смотреть. Компилятор называется dccarm.exe, как узнать о
> нем больше информации, я сходу не понял :)


дизассемблируй пожалуйста (команды ассемблера и бинарное представление) вот эту функцию
и подтверди предположение, что функция вызывается по команде bl
function Test(const X, Y: integer): integer;
begin
 if (X < Y) then
 begin
   Result := $01020304;
 end else
 begin
   Result := ((X*Y)*(X-Y+5) mod Y) + $87654321;
 end;
end;


 
Rouse_ ©   (2014-01-02 19:58) [19]


> и подтверди предположение, что функция вызывается по команде
> bl

BL это аналог CALL в арме, там по логике так и должно быть сгенерено.


 
Rouse_ ©   (2014-01-02 20:00) [20]

Хотя там может и BLCC и аналоги быть (а чаму-бы и нет?)


 
DevilDevil ©   (2014-01-02 20:05) [21]

> Rouse_ ©

я знаю. Просто хочу услышать этому подтверждение :) Мож там blx какой-нибудь


 
Rouse_ ©   (2014-01-02 20:29) [22]

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

К примеру.

mov eax, 1
mov edx, 2
call Test

даст BL

а

mov eax, 1
mov edx, 2
cmp ecx, 0
jne @1
call Test
@1:

может привести к свертке Jx инструкции и вызову BLCC (образно)


 
DevilDevil ©   (2014-01-02 20:46) [23]

> Rouse_ ©

Ты не в ту степь уходишь. Я знаю про существование blcc. Сейчас это наименее значимый вопрос


 
RWolf ©   (2014-01-02 21:25) [24]


> [18]

держи:

    28          int Test(int &X, int &Y)
    29          {
    30            if (X < Y)
  \                     _Z4TestRiS_:
  \   00000000   0x6809             LDR      R1,[R1, #+0]
  \   00000002   0x6800             LDR      R0,[R0, #+0]
  \   00000004   0x4288             CMP      R0,R1
  \   00000006   0xDA02             BGE.N    ??Test_0
    31            {
    32              return 0x01020304;
  \   00000008   0x.... 0x....      LDR.W    R0,??DataTable21_3
  \   0000000C   0x4770             BX       LR
    33            }
    34            else
    35            {
    36              return ((X*Y)*(X-Y+5) % Y) + 0x87654321;
  \                     ??Test_0:
  \   0000000E   0xFB01 0xF200      MUL      R2,R1,R0
  \   00000012   0x1A40             SUBS     R0,R0,R1
  \   00000014   0x1D40             ADDS     R0,R0,#+5
  \   00000016   0x4350             MULS     R0,R0,R2
  \   00000018   0xFB90 0xF2F1      SDIV     R2,R0,R1
  \   0000001C   0xFB01 0x0012      MLS      R0,R1,R2,R0
  \   00000020   0x.... 0x....      LDR.W    R1,??DataTable21_4
  \   00000024   0x1808             ADDS     R0,R1,R0
  \   00000026   0x4770             BX       LR
    37            }
    38          }


 
DevilDevil ©   (2014-01-02 21:47) [25]

> RWolf ©

дак это ж не Delphi
и с каких пор в ARM появилась команда деления ?
и... почему у тебя команды 2х байтные ?

p.s. неточность: X и Y передаются по значению


 
RWolf ©   (2014-01-02 21:51) [26]


> [25]

это эквивалентный код на Си.
const — это передача по ссылке.
команда деления, потому что v7.
двухбайтные, потому что Thumb-2.
может, всё-таки, сначала почитать даташиты?


 
Rouse_ ©   (2014-01-02 22:06) [27]


> может, всё-таки, сначала почитать даташиты?

+146, Димыч, начинать нужно с макулатуры.
Это у тебя еще плевая задачка, оть мне сразу после НГ за три недели нужно будет умудриться впихнуть в 9 кб памяти железки полноценный AES на ARM асме - вот это засада та еще. А тут так - лишь бы разобраться :)


 
DevilDevil ©   (2014-01-02 22:09) [28]

> RWolf ©   (02.01.14 21:51) [26]

> это эквивалентный код на Си.
я ценю
но в данном случае значительно важнее, как компилируется в Delphi

> const — это передача по ссылке.

Если размер структуры превышает размер регистра.
В данном случае по значению
К тому же & - это аналог var

> команда деления, потому что v7.

Не ожидал
Везде пишут, что деления в ARM-е нет

> двухбайтные, потому что Thumb-2.

т.е. в тренде компилировать Thumb-2 ?
в Delphi так же ?

> может, всё-таки, сначала почитать даташиты?

почитай
и давай без наездов


 
DevilDevil ©   (2014-01-02 22:11) [29]

> Rouse_ ©   (02.01.14 22:06) [27]
> +146, Димыч, начинать нужно с макулатуры.

Ну дак я и начал с неё. Который день уже штудирую разные источники ;)
Решил, что наиболее правильное решение - подсмотреть за компилятором Delphi


 
Rouse_ ©   (2014-01-02 22:13) [30]


> DevilDevil ©   (02.01.14 22:11) [29]
> Ну дак я и начал с неё. Который день уже штудирую разные
> источники ;)

Который день - мало, каждый день и много дней - это уже что-то :)


 
RWolf ©   (2014-01-02 22:23) [31]


> но в данном случае значительно важнее, как компилируется
> в Delphi

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


> т.е. в тренде компилировать Thumb-2 ?

в v7 других наборов вообще нет.


> почитай

мне незачем, я эти листинги каждый день вижу.


> и давай без наездов

просто не люблю шапкозакидательского подхода типа «начнём писать компилятор,а набор инструкций потом выучим».


 
DevilDevil ©   (2014-01-02 22:35) [32]

> почему это должно быть важно, если пишется свой компилятор?

Потому что мой "компилятор" на данный момент рассчитан на 3 режима: бинарный, текстовый (ассемблер) и гибрид. Вполне вероятно, что позже добавятся какие-нибудь dcu и obj. Так вот гибрид рассчитан на использование в Delphi. И меня в первую очередь интересует, как устроено в Delphi.

> просто не люблю шапкозакидательского подхода типа «начнём
> писать компилятор,а набор инструкций потом выучим».


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

В частности важно, в тренде Thumb-2 или нет. Потому что если да - нужно закладывать короткие 2х байтные прыжки. Если нет - то только длинные. А ещё оказывается нужно предусматривать ситуации, когда прыжок выходит за диапазон +- 32Мб. С этим тоже что-то нужно делать. Закладываться нужно уже сегодня. Всплывает так много неожиданной информации, которую надо аккуратненько уложить в приемлемую архитектуру :)


 
DevilDevil ©   (2014-01-02 22:41) [33]

Что такое гибрид...
Я не точно, но показательно постараюсь продемонстрировать...

int Test(int &X, int &Y)
__asm {
DD 0x68096800, 0x4288DA02
 LDR.W R0,??DataTable21_3
DD 0x4770FB01, 0xF2001A40, 0x1D404350, 0xFB90F2F1, 0xFB010012      
 LDR.W    R1,??DataTable21_4
DD 0x18084770        
}


 
RWolf ©   (2014-01-02 23:02) [34]

Нужно много чего предусматривать заранее. Например, то, что, в отличие от x86, в коде необходимы literal pools, и они не должны быть далеко от использующего их кода из-за ограничений относительной адресации. Если заранее об этом не позаботиться, потом придётся обвешивать кодогенератор костылями.
Именно поэтому перед написанием транслятора нужно ознакомиться с архитектурой.


 
DevilDevil ©   (2014-01-02 23:21) [35]

> RWolf ©   (02.01.14 23:02) [34]

так то оно так
только для реализации/оптимизации прыжков мне это пока не нужно
нужна информация по прыжкам
самое главное - используется ли (в тренде ли :) Thumb-2 в Delphi :)

куда запропастился Kerk ?


 
Германн ©   (2014-01-03 02:29) [36]


> Rouse_ ©   (02.01.14 22:06) [27]
>
>
> > может, всё-таки, сначала почитать даташиты?
>
> +146, Димыч, начинать нужно с макулатуры.
> Это у тебя еще плевая задачка, оть мне сразу после НГ за
> три недели нужно будет умудриться впихнуть в 9 кб памяти
> железки полноценный AES

9КБ это же до х** и больше. Или я что-то не понимаю?


 
DevilDevil ©   (2014-01-03 22:59) [37]

Ребят, а подскажите пожалуйста ещё, где посмотреть, как бинарно образуются те или иные команды (ARM)
Вот возьмём к примеру x86-64. Прыжки есть условные и безусловные, короткие и большие. Все короткие занимают по 2 байта. Длинные - 5 байт безусловный, 6 байт условный. Отсчёт смещения идёт после команды. На диапазон смещения для коротких прыжков выделяется 8 старших бит: -127..+128

Вот такую же информацию хочу посмотреть по ARMv7, но пока не нахожу


 
DevilDevil ©   (2014-01-03 23:08) [38]

очепятка :)

-128...+127 :)


 
Kerk ©   (2014-01-04 17:09) [39]


> DevilDevil ©   (02.01.14 23:21) [35]
>
> куда запропастился Kerk ?

Дык праздники же :)

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

Тут вызов функции:
http://s3.hostingkartinok.com/uploads/images/2014/01/e7584c130b11cf51fb024fe47f3310f7.png

Тут сама функция:
http://s3.hostingkartinok.com/uploads/images/2014/01/ade3e13f4d2ae6809605b5da7766f4ef.png

Unit1.pas.27: begin
5C13F0C8 80B5             push {r7, lr}
5C13F0CA 6F46             mov r7, sp
5C13F0CC 88B0             sub sp, #32
5C13F0CE 0491             str r1, [sp, #16]
5C13F0D0 0390             str r0, [sp, #12]
Unit1.pas.27: begin
5C13F0D2 0498             ldr r0, [sp, #16]
5C13F0D4 0690             str r0, [sp, #24]
5C13F0D6 0399             ldr r1, [sp, #12]
5C13F0D8 0791             str r1, [sp, #28]
Unit1.pas.28: if (X < Y) then
5C13F0DA 0798             ldr r0, [sp, #28]
5C13F0DC 0699             ldr r1, [sp, #24]
5C13F0DE 8842             cmp r0, r1
5C13F0E0 0DDB             blt.n 0x5c13f0fe <Unit1.Test(int, int)+54>
5C13F0E2 FFE7             b.n 0x5c13f0e4 <Unit1.Test(int, int)+28>
Unit1.pas.33: Result := ((X*Y)*(X-Y+5) mod Y) + $87654321;
5C13F0E4 0798             ldr r0, [sp, #28]
5C13F0E6 0699             ldr r1, [sp, #24]
5C13F0E8 00FB01F2         mul.w r2, r0, r1
5C13F0EC 401A             subs r0, r0, r1
5C13F0EE 0530             adds r0, #5
5C13F0F0 5043             muls r0, r2
5C13F0F2 0029             cmp r1, #0
5C13F0F4 0291             str r1, [sp, #8]
5C13F0F6 0190             str r0, [sp, #4]
5C13F0F8 07D0             beq.n 0x5c13f10a <Unit1.Test(int, int)+66>
5C13F0FA 08E0             b.n 0x5c13f10e <Unit1.Test(int, int)+70>
Unit1.pas.35: end;
5C13F0FC 15E0             b.n 0x5c13f12a <Unit1.Test(int, int)+98>
5C13F0FE 40F20430         movw r0, #772 ; 0x304
5C13F102 C0F20210         movt r0, #258 ; 0x102
Unit1.pas.30: Result := $01020304;
5C13F106 0590             str r0, [sp, #20]
5C13F108 F8E7             b.n 0x5c13f0fc <Unit1.Test(int, int)+52>
Unit1.pas.33: Result := ((X*Y)*(X-Y+5) mod Y) + $87654321;
5C13F10A E5F7C1DD         bl 0x5b924c90 <System._IntDivByZero()>
5C13F10E 44F22130         movw r0, #17185 ; 0x4321
5C13F112 C8F26570         movt r0, #34661 ; 0x8765
5C13F116 0199             ldr r1, [sp, #4]
5C13F118 0090             str r0, [sp, #0]
5C13F11A 0846             mov r0, r1
5C13F11C 0299             ldr r1, [sp, #8]
5C13F11E 0CF0F8EA         blx 0x5c14b710 <__modsi3>
5C13F122 0099             ldr r1, [sp, #0]
5C13F124 0844             add r0, r1
5C13F126 0590             str r0, [sp, #20]
5C13F128 E8E7             b.n 0x5c13f0fc <Unit1.Test(int, int)+52>
Unit1.pas.35: end;
5C13F12A 0598             ldr r0, [sp, #20]


 
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)
> потому что я знаю как переводится &laquo;Jump&raquo;
> и &laquo;прыжок&raquo; подходит по смыслу значительно больше, чем &laquo;переход&raquo;

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


 
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]

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


 
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.69 MB
Время: 0.008 c
15-1388521270
Кузьмич
2014-01-01 00:21
2014.07.27
С Новым годом и Рождеством коллеги!!!


15-1388575929
wl
2014-01-01 15:32
2014.07.27
вопрос про собеседание


15-1388521802
Юрий
2014-01-01 00:30
2014.07.27
С днем рождения ! 1 января 2014 среда


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


15-1388818291
EsetNOD32
2014-01-04 10:51
2014.07.27
Anatoly Podgoretsky - как это понимать?