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

Вниз

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

Наверх





Память: 0.67 MB
Время: 0.004 c
15-1386694836
Rouse_
2013-12-10 21:00
2014.07.27
О пользе домашней еды :)


15-1366998290
Дмитрий С
2013-04-26 21:44
2014.07.27
OTG кабель с зарядкой.


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


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


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





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский