Главная страница
    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



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

Форум: "Прочее";
Текущий архив: 2014.07.27;
Скачать: [xml.tar.bz2];

Наверх





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


15-1388521270
Кузьмич
2014-01-01 00:21
2014.07.27
С Новым годом и Рождеством коллеги!!!


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


15-1388781002
Юрий
2014-01-04 00:30
2014.07.27
С днем рождения ! 4 января 2014 суббота


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





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