Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Ср дек 12, 2018 02:11

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 38 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: генератор примитивов с помощью gcc
СообщениеДобавлено: Вс окт 07, 2012 21:36 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
В ассемблер и в код.
В моем случае
Код:
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]!");

}


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: генератор примитивов с помощью gcc
СообщениеДобавлено: Вс окт 07, 2012 21:45 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6452
Благодарил (а): 14 раз.
Поблагодарили: 101 раз.
А что он делать-то должен?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: генератор примитивов с помощью gcc
СообщениеДобавлено: Вс окт 07, 2012 22:55 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
Хищник писал(а):
А что он делать-то должен?


Создается файул 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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: генератор примитивов с помощью gcc
СообщениеДобавлено: Пн окт 08, 2012 00:20 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6452
Благодарил (а): 14 раз.
Поблагодарили: 101 раз.
Это все хорошо. Просто возникает несколько практических вопросов. Если сравнивать с ручным набором аналогичного кода, то что меняется? Как проверить, для всех ли платформ это работает? В чем выигрыш по эффективности кода, и не пропущены ли какие-то специфичные моменты для отдельных платформ? В конце концов, что меняется по сравнению с Си, который откомпилируется точно так же, для всех ядер, поддерживаемых gcc?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: генератор примитивов с помощью gcc
СообщениеДобавлено: Пн окт 08, 2012 11:59 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
Хищник писал(а):
Если сравнивать с ручным набором аналогичного кода, то что меняется?

Что значит с ручным набором? Писать все примитивы самому в машкодах на основании
своего понимания документации? Это еще если найдется документация с описанием 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]
Форт система позволяет работать в интерактивном режиме и обладает гибким синтаксисом.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: генератор примитивов с помощью gcc
СообщениеДобавлено: Пн окт 08, 2012 20:40 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6452
Благодарил (а): 14 раз.
Поблагодарили: 101 раз.
Mihail писал(а):
Что значит с ручным набором? Писать все примитивы самому в машкодах на основании
своего понимания документации? Это еще если найдется документация с описанием OPCODES
(без ошибок).

А почему обязательно опкоды? Можно написать на С/С++/С#/Java/ и т.д. Приведенное выше - обычный фрагмент Форта на Си. Назвать компилятор "генератором примитивов" - это нечто.

Mihail писал(а):
Там еще приведен ассемблерный код. По мимо форта требуется программа
инициализации и драйверы. Я пишу все это на Си, создаю lss файл.
Затем на Форте создаю преобразователь этого файла в бинарник
попутно Форт узнает адреса драйверов и к этому бинарнику добавляю программу
написанную на форте. Сперва простую тестовую, затем расширяю.


Боюсь спрашивать, давно ли возникла столь свежая идея :)
Mihail писал(а):
Форт система позволяет работать в интерактивном режиме и обладает гибким синтаксисом.

Скажи, пожалуйста, у тебя склероз (и ты не помнишь, с кем общаешься)? Вот что нового ты мне сейчас рассказал? Я тебя спросил, в чем отличие приведенного кода от Форта на Си. Пока потихоньку выясняется, что ни в чем, просто просматривается очередной мегапроект "от Максимова"...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: генератор примитивов с помощью gcc
СообщениеДобавлено: Вт окт 09, 2012 12:37 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
Хищник писал(а):
Можно написать на С/С++/С#/Java/ и т.д. Приведенное выше - обычный фрагмент Форта на Си. Назвать компилятор "генератором примитивов" - это нечто.

При создания форт-системы для новой платформы с помощью
самого форта или ассемблера, задача сводится к написанию примитивов.
Все остальное можно найти в инете. Так вот, если для новой платформы уже
существует gcc, то и примитивы писать не надо. Их можно получить скомпилировав
приведенный выше фрагмент и получить lss файл содержащий их в HEX и
ассемблерном виде. По средствам ассемблера можно достичь максимальной
эффективности. (можно использовать ассемблер предназначенный для другой
платформы) Возможности Форта не уступают ассемблеру. При этом,
кросс компилятор Фора может быть совместим с целевой системой
которую он создает. Вообще, легок для модификации.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: генератор примитивов с помощью gcc
СообщениеДобавлено: Вт окт 09, 2012 13:09 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6452
Благодарил (а): 14 раз.
Поблагодарили: 101 раз.
Мне вот интересно, ты действительно не понимаешь, что написал банальность, или просто игнорируешь сделанное ранее? Фортов на Си десятки, если не сотни. Еще раз: что нового ты предложил?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: генератор примитивов с помощью gcc
СообщениеДобавлено: Вт окт 09, 2012 16:19 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
Хищник писал(а):
Еще раз: что нового ты предложил?

Еще раз. Берем исходники форт-системы на Форте
(для кросс компилятора) и заменяем его примитивы на те,
что мы получили в lss файле. И плучаем форт-систему
для новой платформы на Форте.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: генератор примитивов с помощью gcc
СообщениеДобавлено: Вт окт 09, 2012 16:32 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6452
Благодарил (а): 14 раз.
Поблагодарили: 101 раз.
Иными словами: берем код, скомпилированный Фортом и начинаем менять его куски на код, скомпилированный Си. Нечего сказать, свежо и оригинально :?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: генератор примитивов с помощью gcc
СообщениеДобавлено: Вт окт 09, 2012 16:41 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
Хищник писал(а):
берем код, скомпилированный Фортом и начинаем менять его куски на код, скомпилированный Си.

Берем еще не скомпилированный Фортом код (исходный). Его куски и
меняем на код, восстановленный программой objdump.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: генератор примитивов с помощью gcc
СообщениеДобавлено: Вт окт 09, 2012 16:51 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6452
Благодарил (а): 14 раз.
Поблагодарили: 101 раз.
Если бы эти тонкости еще имели значение... Компилятор Си компилирует код. Точка. Исходные тексты, судя по их виду, легко набираются руками. Дополнительные телодвижения только затрудняют сборку.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: генератор примитивов с помощью gcc
СообщениеДобавлено: Вт окт 16, 2012 02:18 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 521
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 22 раз.
Хищник писал(а):
Назвать компилятор "генератором примитивов" - это нечто.
Видимо, это очередной проект "программирование без программирования". Видимо это идея фикс, которая постоянно, сволочь, витает в воздухе. В данном случае программирование на ассемблере ... без программирования на ассемблере. Написать примитивы на Си и запустить компилятор Си с ключом "создавать ассемблерный листинг". И ура ... примитивы на ассемблере готовы. И даже уже скомпилированы. Бинарик ведь тоже создается. Потом чуток примитивы подправить (вставляя модифицированные куски ассемблерного листинга обратно в Си уже как ассемблерные вставки), снова скомпилировать и подклеить полученное к Форту на Форте.

Ну что-же такой подход тоже имеет право на существование. Просто я написал бы примитивы сразу на ассемблере. А ты бы сразу на Си.


Последний раз редактировалось Ethereal Вт окт 16, 2012 03:25, всего редактировалось 5 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: генератор примитивов с помощью gcc
СообщениеДобавлено: Вт окт 16, 2012 02:33 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 521
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 22 раз.
Mihail писал(а):
Писать все примитивы самому в машкодах на основании
своего понимания документации?
Я написал свой первый вирус для ДВК-3. Так к ней вообще документации не было. Никакой.
А теперь документации навалом, но возникла проблема "вдруг мы не так поймем" ?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: генератор примитивов с помощью gcc
СообщениеДобавлено: Вт окт 16, 2012 03:14 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 521
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 22 раз.
Хищник писал(а):
Иными словами: берем код, скомпилированный Фортом и начинаем менять его куски на код, скомпилированный Си. Нечего сказать, свежо и оригинально :?
Знаешь как я когда-то изучал Си форсированным методом (метод сам придумал). У меня был Сокобан, написанны на ТурбоПаскале ибо Паскаль я знал. И я сунул паскалевский исходник Сокобана на компиляцию ТурбоСи. Компилятор, естественно, начал ругаться. Я смотрел на какую именно строчку он ругается, смотрел в учебник - как точно такое-же записывается на Си. И исправлял строчку. На третий вечер я добрался до конца программы. На четвертый она полностью заработала. И я уже более менее знал Си. Если бы я только читал учебник у меня бы ушло на порядок больше времени.

Короче говоря, иногда важен финт ушами, чтобы получить результат гораздо быстрее. Михаил сделал такой финт ушами - заставил Си создавать ассемблерные примитивы Форта для новой платформы.
Не надо писать Форт на Си. Не надо хорошо знать ассемблер. А результат есть !



За это сообщение автора Ethereal поблагодарил: zehotello
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 38 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB