Форум: "Прочее";
Текущий архив: 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, как узнать о
> нем больше информации, я сходу не понял :)
дизассемблируй пожалуйста (команды ассемблера и бинарное представление) вот эту функцию
и подтверди предположение, что функция вызывается по команде blfunction 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.pngUnit1.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