Forth http://fforum.winglion.ru/ |
|
генератор примитивов с помощью gcc http://fforum.winglion.ru/viewtopic.php?f=39&t=2884 |
Страница 1 из 3 |
Автор: | Mihail [ Вс окт 07, 2012 21:36 ] |
Заголовок сообщения: | генератор примитивов с помощью gcc |
В ассемблер и в код. В моем случае Код: arm-none-eabi-gcc -Os -mthumb -g -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -c prim.c -o prim.o arm-none-eabi-objdump -S -C prim.o >prim.lss файл prim.c Код: int gettos();
int * getpsp(); int cci() { int register ttos,tmp; int *psp; ttos=gettos(); psp=getpsp(); if(gettos()) // dup *--psp=ttos; if(gettos()) // over ttos=psp[1]; if(gettos()) // tuck { tmp=psp[0]; psp[0]=ttos; *--psp=tmp; } if(gettos()) // rot { tmp=psp[1]; psp[1]=psp[0]; psp[0]=ttos; ttos=tmp; } if(gettos()) // -rot { tmp=ttos; ttos=psp[0]; psp[0]=psp[1]; psp[1]=tmp; } if(gettos()) // 2swap { tmp=ttos; ttos=psp[1]; psp[1]=tmp; tmp=psp[0]; psp[0]=psp[2]; psp[2]=tmp; } if(ttos) *--psp=ttos; // ?dup if(gettos()) // 2drop { psp++; ttos=*psp++; } if(gettos()) ttos+=sizeof(ttos); // cell+ if(gettos()) ttos-=sizeof(ttos); // cell- if(gettos()) ttos*=sizeof(ttos); // cells if(gettos()) ttos=(unsigned)ttos/sizeof(ttos); // cell/ if(gettos()) ttos+=*psp++; // + if(gettos()) ttos=*psp++-ttos; // - if(gettos()) ttos&=*psp++; // and if(gettos()) ttos|=*psp++; // or if(gettos()) ttos^=*psp++; // xor if(gettos()) ttos=~ttos; // invert if(gettos()) ttos=-ttos; // negate if(gettos()) ttos=-(*psp++>ttos); // > if(gettos()) ttos=-(*psp++<ttos); // < if(gettos()) ttos=-(ttos<0); // 0< if(gettos()) ttos=-((unsigned)*psp++>(unsigned)ttos); // u> if(gettos()) ttos=-((unsigned)*psp++<(unsigned)ttos); // u< if(gettos()) ttos=-(*psp++=ttos); // = if(gettos()) ttos=-(0==ttos); // 0= if(gettos()) ttos=-(0==(ttos|*psp++)); // d0= if(gettos()) ttos=-(*psp++!=ttos); // <> if(gettos()) // min { ttos= ((*psp) < (ttos) ? (*psp) : (ttos)); psp++; } if(gettos()) // max { ttos= ((*psp) > (ttos) ? (*psp) : (ttos)); psp++; } if(gettos()) // abs { ttos= ( 0 < (ttos) ? (-ttos) : (ttos)); } if(gettos()) // umin { ttos= ((unsigned)(*psp) < (unsigned)(ttos) ? (*psp) : (ttos)); psp++; } if(gettos()) // umax { ttos= ((unsigned)(*psp) > (unsigned)(ttos) ? (*psp) : (ttos)); psp++; } if(gettos()) ttos*=*psp++; // * if(gettos()) ttos=*psp++/ttos; // / if(gettos()) ttos=*psp++%ttos; // mod if(gettos()) { // /mod tmp=*psp%ttos; ttos=*psp/ttos; *psp=tmp; } if(gettos()) // m* { long long ltmp=*psp; ltmp*=ttos; *psp=(int)ltmp; ttos=(int)(ltmp>>32); } if(gettos()) ttos=*psp++ >> ttos; // rshift if(gettos()) ttos=*psp++ << ttos; // lshift if(gettos()) { // 2dup *--psp=ttos; tmp=psp[1]; *--psp=tmp; } if(gettos()) ttos=* (char*)ttos ; // c@ if(gettos()) ttos=* (short*)ttos ; // w@ if(gettos()) ttos=* (int*)ttos ; // @ if(gettos()) { // 2@ *--psp=((int*)ttos)[1] ; ttos= *(int*)ttos ; } if(gettos()) ttos= psp[ttos] ; // pick if(gettos()) { *(char*)ttos=(char)*psp++; ttos=*psp++;} // c! if(gettos()) { *(short*)ttos=(short)*psp++; ttos=*psp++;} // w! if(gettos()) { *(int*)ttos=*psp++; ttos=*psp++;} // ! if(gettos()) { // 2! *(int*)ttos++=*psp++; *(int*)ttos=*psp++; ttos=*psp++; } if(gettos()) { *(int*)ttos=0; ttos=*psp++;} // 0! if(gettos()) { *(int*)ttos+=0; ttos=*psp++;} // 1+! if(gettos()) { *(int*)ttos-=0; ttos=*psp++;} // 1-! if(gettos()) { *--psp=ttos; ttos=(int)psp;} // SP@ if(gettos()) { psp=(int*)ttos; ttos=*psp++; } // SP! if(gettos()) { // fill int tt; char * ptt; tt=*psp++; ptt=(char*)*psp++; while(tt){ *ptt++=(char)ttos; tt--; } ttos=*psp++; } if(gettos()) { // cmove char * ptt0; char * ptt1; ptt0=(char*)*psp++; ptt1=(char*)*psp++; while(ttos){ *ptt0++=*ptt1++; ttos--; } ttos=*psp++; } if(gettos()) { // cmove> char * ptt0; char * ptt1; ptt0=(char*)*psp++; ptt1=(char*)*psp++; while(ttos){ ttos--; ptt0[ttos]=ptt1[ttos]; } ttos=*psp++; } return ttos; } int zz2() { __asm(" nop "); } main() { cci(); __asm("ldr r5,[sp,#0]"); __asm("ldr r5,[sp,#4]"); __asm("ldr r5,[sp],#4"); __asm("add sp,#4"); // rdrop __asm("str r5, [sp,#-4]!"); } |
Автор: | Hishnik [ Вс окт 07, 2012 21:45 ] |
Заголовок сообщения: | Re: генератор примитивов с помощью gcc |
А что он делать-то должен? |
Автор: | Mihail [ Вс окт 07, 2012 22:55 ] |
Заголовок сообщения: | Re: генератор примитивов с помощью gcc |
Хищник писал(а): А что он делать-то должен? Создается файул prim.lss Берем фрагмент этого файла Код: if(gettos()) // dup e: f7ff fffe bl 0 <gettos> 12: b110 cbz r0, 1a <cci+0x1a> *--psp=ttos; 14: f844 5c04 str.w r5, [r4, #-4] 18: 3c04 subs r4, #4 if(gettos()) // over 1a: f7ff fffe bl 0 <gettos> 1e: b100 cbz r0, 22 <cci+0x22> ttos=psp[1]; 20: 6865 ldr r5, [r4, #4] if(gettos()) // tuck 22: f7ff fffe bl 0 <gettos> 26: b130 cbz r0, 36 <cci+0x36> { tmp=psp[0]; psp[0]=ttos; 28: 4623 mov r3, r4 ttos=psp[1]; if(gettos()) // tuck { tmp=psp[0]; 2a: 6822 ldr r2, [r4, #0] psp[0]=ttos; 2c: f843 5904 str.w r5, [r3], #-4 *--psp=tmp; 30: f844 2c04 str.w r2, [r4, #-4] 34: 461c mov r4, r3 } Выкинув лишнее и добавив W, получаем: Код: HEX
: NEXT 0x4770 W, \ bx lr ; CODE DUP f844 W, 5c04 W, \ str.w r5, [r4, #-4] 3c04 W, \ subs r4, #4 NEXT END_CODE CODE OVER f844 W, 5c04 W, \ str.w r5, [r4, #-4] \ DUP 3c04 W, \ subs r4, #4 6865 W, \ ldr r5, [r4, #4] NEXT END_CODE CODE TUCK 4623 W, \ mov r3, r4 6822 W, \ ldr r2, [r4, #0] f843 W, 5904 W, \ str.w r5, [r3], #-4 f844 W, 2c04 W, \ str.w r2, [r4, #-4] 461c W, \ mov r4, r3 NEXT END_CODE |
Автор: | Hishnik [ Пн окт 08, 2012 00:20 ] |
Заголовок сообщения: | Re: генератор примитивов с помощью gcc |
Это все хорошо. Просто возникает несколько практических вопросов. Если сравнивать с ручным набором аналогичного кода, то что меняется? Как проверить, для всех ли платформ это работает? В чем выигрыш по эффективности кода, и не пропущены ли какие-то специфичные моменты для отдельных платформ? В конце концов, что меняется по сравнению с Си, который откомпилируется точно так же, для всех ядер, поддерживаемых gcc? |
Автор: | Mihail [ Пн окт 08, 2012 11:59 ] |
Заголовок сообщения: | Re: генератор примитивов с помощью gcc |
Хищник писал(а): Если сравнивать с ручным набором аналогичного кода, то что меняется? Что значит с ручным набором? Писать все примитивы самому в машкодах на основании своего понимания документации? Это еще если найдется документация с описанием OPCODES (без ошибок). Цитата: Как проверить, для всех ли платформ это работает? Там еще приведен ассемблерный код. По мимо форта требуется программа инициализации и драйверы. Я пишу все это на Си, создаю lss файл. Затем на Форте создаю преобразователь этого файла в бинарник попутно Форт узнает адреса драйверов и к этому бинарнику добавляю программу написанную на форте. Сперва простую тестовую, затем расширяю. Цитата: В чем выигрыш по эффективности кода, и не пропущены ли какие-то специфичные моменты для отдельных платформ? Если gcc что-то создал нерационально, можно для этого фрагмента создать ассемблерную вставку. К стати, фрагмент работы со стеком (физическим) возвратов не заставить gcc создать. для этого и пришлость: Код: __asm("ldr r5,[sp,#0]"); __asm("ldr r5,[sp,#4]"); __asm("ldr r5,[sp],#4"); __asm("add sp,#4"); // rdrop __asm("str r5, [sp,#-4]!"); [/quote] В конце концов, что меняется по сравнению с Си, который откомпилируется точно так же, для всех ядер, поддерживаемых gcc?[/quote] Форт система позволяет работать в интерактивном режиме и обладает гибким синтаксисом. |
Автор: | Hishnik [ Пн окт 08, 2012 20:40 ] |
Заголовок сообщения: | Re: генератор примитивов с помощью gcc |
Mihail писал(а): Что значит с ручным набором? Писать все примитивы самому в машкодах на основании своего понимания документации? Это еще если найдется документация с описанием OPCODES (без ошибок). А почему обязательно опкоды? Можно написать на С/С++/С#/Java/ и т.д. Приведенное выше - обычный фрагмент Форта на Си. Назвать компилятор "генератором примитивов" - это нечто. Mihail писал(а): Там еще приведен ассемблерный код. По мимо форта требуется программа инициализации и драйверы. Я пишу все это на Си, создаю lss файл. Затем на Форте создаю преобразователь этого файла в бинарник попутно Форт узнает адреса драйверов и к этому бинарнику добавляю программу написанную на форте. Сперва простую тестовую, затем расширяю. Боюсь спрашивать, давно ли возникла столь свежая идея Mihail писал(а): Форт система позволяет работать в интерактивном режиме и обладает гибким синтаксисом. Скажи, пожалуйста, у тебя склероз (и ты не помнишь, с кем общаешься)? Вот что нового ты мне сейчас рассказал? Я тебя спросил, в чем отличие приведенного кода от Форта на Си. Пока потихоньку выясняется, что ни в чем, просто просматривается очередной мегапроект "от Максимова"... |
Автор: | Mihail [ Вт окт 09, 2012 12:37 ] |
Заголовок сообщения: | Re: генератор примитивов с помощью gcc |
Хищник писал(а): Можно написать на С/С++/С#/Java/ и т.д. Приведенное выше - обычный фрагмент Форта на Си. Назвать компилятор "генератором примитивов" - это нечто. При создания форт-системы для новой платформы с помощью самого форта или ассемблера, задача сводится к написанию примитивов. Все остальное можно найти в инете. Так вот, если для новой платформы уже существует gcc, то и примитивы писать не надо. Их можно получить скомпилировав приведенный выше фрагмент и получить lss файл содержащий их в HEX и ассемблерном виде. По средствам ассемблера можно достичь максимальной эффективности. (можно использовать ассемблер предназначенный для другой платформы) Возможности Форта не уступают ассемблеру. При этом, кросс компилятор Фора может быть совместим с целевой системой которую он создает. Вообще, легок для модификации. |
Автор: | Hishnik [ Вт окт 09, 2012 13:09 ] |
Заголовок сообщения: | Re: генератор примитивов с помощью gcc |
Мне вот интересно, ты действительно не понимаешь, что написал банальность, или просто игнорируешь сделанное ранее? Фортов на Си десятки, если не сотни. Еще раз: что нового ты предложил? |
Автор: | Mihail [ Вт окт 09, 2012 16:19 ] |
Заголовок сообщения: | Re: генератор примитивов с помощью gcc |
Хищник писал(а): Еще раз: что нового ты предложил? Еще раз. Берем исходники форт-системы на Форте (для кросс компилятора) и заменяем его примитивы на те, что мы получили в lss файле. И плучаем форт-систему для новой платформы на Форте. |
Автор: | Hishnik [ Вт окт 09, 2012 16:32 ] |
Заголовок сообщения: | Re: генератор примитивов с помощью gcc |
Иными словами: берем код, скомпилированный Фортом и начинаем менять его куски на код, скомпилированный Си. Нечего сказать, свежо и оригинально |
Автор: | Mihail [ Вт окт 09, 2012 16:41 ] |
Заголовок сообщения: | Re: генератор примитивов с помощью gcc |
Хищник писал(а): берем код, скомпилированный Фортом и начинаем менять его куски на код, скомпилированный Си. Берем еще не скомпилированный Фортом код (исходный). Его куски и меняем на код, восстановленный программой objdump. |
Автор: | Hishnik [ Вт окт 09, 2012 16:51 ] |
Заголовок сообщения: | Re: генератор примитивов с помощью gcc |
Если бы эти тонкости еще имели значение... Компилятор Си компилирует код. Точка. Исходные тексты, судя по их виду, легко набираются руками. Дополнительные телодвижения только затрудняют сборку. |
Автор: | Ethereal [ Вт окт 16, 2012 02:18 ] |
Заголовок сообщения: | Re: генератор примитивов с помощью gcc |
Хищник писал(а): Назвать компилятор "генератором примитивов" - это нечто. Видимо, это очередной проект "программирование без программирования". Видимо это идея фикс, которая постоянно, сволочь, витает в воздухе. В данном случае программирование на ассемблере ... без программирования на ассемблере. Написать примитивы на Си и запустить компилятор Си с ключом "создавать ассемблерный листинг". И ура ... примитивы на ассемблере готовы. И даже уже скомпилированы. Бинарик ведь тоже создается. Потом чуток примитивы подправить (вставляя модифицированные куски ассемблерного листинга обратно в Си уже как ассемблерные вставки), снова скомпилировать и подклеить полученное к Форту на Форте.Ну что-же такой подход тоже имеет право на существование. Просто я написал бы примитивы сразу на ассемблере. А ты бы сразу на Си. |
Автор: | Ethereal [ Вт окт 16, 2012 02:33 ] |
Заголовок сообщения: | Re: генератор примитивов с помощью gcc |
Mihail писал(а): Писать все примитивы самому в машкодах на основании Я написал свой первый вирус для ДВК-3. Так к ней вообще документации не было. Никакой.своего понимания документации? А теперь документации навалом, но возникла проблема "вдруг мы не так поймем" ? |
Автор: | Ethereal [ Вт окт 16, 2012 03:14 ] |
Заголовок сообщения: | Re: генератор примитивов с помощью gcc |
Хищник писал(а): Иными словами: берем код, скомпилированный Фортом и начинаем менять его куски на код, скомпилированный Си. Нечего сказать, свежо и оригинально Знаешь как я когда-то изучал Си форсированным методом (метод сам придумал). У меня был Сокобан, написанны на ТурбоПаскале ибо Паскаль я знал. И я сунул паскалевский исходник Сокобана на компиляцию ТурбоСи. Компилятор, естественно, начал ругаться. Я смотрел на какую именно строчку он ругается, смотрел в учебник - как точно такое-же записывается на Си. И исправлял строчку. На третий вечер я добрался до конца программы. На четвертый она полностью заработала. И я уже более менее знал Си. Если бы я только читал учебник у меня бы ушло на порядок больше времени.Короче говоря, иногда важен финт ушами, чтобы получить результат гораздо быстрее. Михаил сделал такой финт ушами - заставил Си создавать ассемблерные примитивы Форта для новой платформы. Не надо писать Форт на Си. Не надо хорошо знать ассемблер. А результат есть ! |
Страница 1 из 3 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |