Board.KolibriOS.org
http://board.kolibrios.org/

Tiny C Compiler
http://board.kolibrios.org/viewtopic.php?f=45&t=565
Page 6 of 16

Author:  O01eg [ Sun Sep 24, 2006 11:18 am ]
Post subject: 

А есть что либо для SVN весящее поменьше, желательно менее 1 МБ?

Author:  Ghost [ Sat Oct 07, 2006 9:05 pm ]
Post subject: 

Вот ещё две интересные особенности :
1) Функция такого вода скомпилируется без проблем, но возвращает неопределённо значение, а вовсе не 0 как многие другие компилеры.
Code:
int func(){
}


2) Процедура int _msys_get_process_table(process_table_entry* proctab,int pid); работает правильно но с двумя нюансами :
а) структура proctab должна иметь размер 1Kb, в противном случае (при использовании структуры process_table_entry, размер которой меньше) происходит затирание части кода/данных и как следстви "нестабильная" работа программы.
б) тоже связано со структурой : дело в том, что tcc варанивает все данные по длинне машинного слова (4 байта), и получается что например process_table_entry.winx_start имеет смещение не 0x22 а совсем другое, и пользоватся структурои невозможно.
Писать полную реализацию мне некогда/незачем, для себя использовал такой код :
Code:
void CheckSize(int *xs, int *ys){
// xs, ys - размеры окна, устанавливаются в соответствии с действительным положением
   char *pce = malloc(1024);
   //~ [ebp + 8 ] -> xs
   //~ [ebp + 12] -> ys
   //~ [ebp - 4 ] -> pce
   
   asm("movl   $9, %eax");
   asm("movl   -4(%ebp), %ebx");
   asm("movl   $-1, %ecx");
   asm("int   $0x40");
   asm("movl   8(%ebp), %eax");
   asm("movl   (%eax), %ecx");   // xs
   asm("movl   12(%ebp), %eax");
   asm("movl   (%eax), %edx");   // ys
   asm("cmpl   42(%ebx), %ecx");
   asm("jne   13");         // не трогать (весь код)
   asm("cmpl   46(%ebx), %edx");
   asm("je   41");         // не трогать (весь код)
   asm("movl   8(%ebp), %eax");   // xs = pce.winx_size
   asm("movl   42(%ebx), %ecx");
   asm("movl   %ecx, (%eax)");
   asm("movl   12(%ebp), %eax");   // ys = pce.winy_size
   asm("movl   46(%ebx), %edx");
   asm("movl   %ecx, (%eax)");
   
   asm("movl    %edx,%esi");
   asm("movl    %ecx,%edx");
   asm("movl    $-1,%ebx");
   asm("movl    $-1,%ecx");
   asm("movl    $67,%eax");
   asm("int   $0x40");
   free(pce);
   return;
}

Author:  halyavin [ Sun Oct 08, 2006 10:26 am ]
Post subject: 

Ghost
Не вижу большого смысла в фиче дефолтной установки результата в ноль. А вдруг результат формируется в ассемблерной вставке?
tcc поддерживает #pragma pack - переписал определение структуры с его использованием (попутно обнаружил, что я пропустил одно поле...).

Author:  Serial [ Tue Feb 27, 2007 2:37 pm ]
Post subject: 

Поделитесь пожалуйста файликом start.o

Author:  diamond [ Wed Feb 28, 2007 8:59 pm ]
Post subject: 

Пожалуйста: http://diamondz.land.ru/start.o
А в чём, собственно, проблема с компиляцией? В папке start достаточно сказать "fasm start.asm".

Author:  andrew_programmer [ Wed Apr 04, 2007 11:39 pm ]
Post subject: 

Стал я прикручивать интерфейс к программе spektr, используя библиотеку libGUI.Сначала было всё нормально.Тоесть компиляция проходила успешно и код работал.Как только мне потребовалось приделать сложные GUI компоненты, такие как закладки, то возникла проблема.При создании закладки нужно передавать в структуру закладки указатели на дочерние контролы(GUI компоненты, которые будут на закладках).
Я делал всё правильно(соблюдал все типы данных).Но TinyC выдаёт сообщение об ошибке.Это сообщение типа ,-"невозможно приравнять указатель типа struc anonymus* указателю unsigned int * ".Я попробовал скомпилировать spektr.c в объектник при помощи GCC.Он всё нормально скомпилировал(небыло никаких сообщений об ошибках).По содержимому ассемблерного кода, скомпилированного GCC я понял, что всё в порядке(задуманное на C верно сгенерировано в assembler).Тогда решил скомпилировать всю программу spektr.c при помощи GCC.
Воспользоваться статьёй DIAMOND-а не получилось, так как у меня используются obj файлы собственного производства.
Тогда я решил скомпилировать так:

создаём объектники и собираем их в двоичный файл spektr
gcc -o ./spektr start.o k_lib.o ./spektr.c -nostdlib

превращаем двоичный файл в бинарник

objcopy ./spektr -O binary
у меня получился бинарный файл spektr, но это не был исполняемый файл Колибри.Я непонимаю, что я не так сделал ?

Пояснения.
start.o это модернизированный start.asm для использования нового менеджера памяти Колибри (в остальном код не изменён).
k_lib.o это библиотека формата ELF содержащая некоторые системные функции Колибри, котоые используются мной в программе.

Пожалуйста помогите советом - мне это очень нужно.

Author:  Serial [ Thu Apr 05, 2007 9:44 am ]
Post subject: 

Попробуй использовать void * вместо unsigned int *

А вообще у меня получилось писать на сишке для Kolibri только в Visual Studio 2005 (gcc не пробовал). Но и там была туева хуча проблем :(

Author:  andrew_programmer [ Thu Apr 05, 2007 4:43 pm ]
Post subject: 

>Попробуй использовать void * вместо unsigned int *

В моём случае так делать нельзя.Потому что у меня структура - это тип данных.И если в одном из её полей организовать указатель типа void* , то компилятор не моймёт какого размера она должна быть(структура).
Тоесть имеется структура закладка, некоторые из полей которой являются указателями на другие структуры.К примеру структуры кнопки или чекбокса.GCC нормально понимает мой код, а TinyC нет.Помоему это связано с ошибкой в компиляторе.Тем более, что Халявин
Андрей(halyvin) уже находил некоторые ошибки.


Неужели на этом форуме нет людей умеющих компилировать код под Колибри при помощи GCC ?

Author:  vectoroc [ Thu Apr 05, 2007 5:29 pm ]
Post subject: 

melibc прекрасно компиляется с помощью gcc. И тестовые проги тоже

Author:  andrew_programmer [ Thu Apr 05, 2007 5:43 pm ]
Post subject: 

>melibc прекрасно компиляется с помощью gcc. И тестовые проги тоже

У меня давно melibc установлена и тестовые программы тоже.
Хочет того программа или нет, но ко всем тестовым программам(и не только) линкуются функции из melibc.
При компиляции моей программы spektr происходит конфликт между функциями из melibc и функциями из k_lib.o
Это функции работы с памятью.
Также возникают проблемы с экспортируемыми __argv и __argc.Они содержаться в объектнике start, который формирует свой заголовок программы, что опять приводит к конфликту.
Поэтому мне нужен вариант сборки программы без использования melibc и без соответствующих скриптов для неё.

Author:  diamond [ Thu Apr 05, 2007 6:03 pm ]
Post subject: 

andrew_programmer wrote:
превращаем двоичный файл в бинарник

objcopy ./spektr -O binary
у меня получился бинарный файл spektr, но это не был исполняемый файл Колибри.Я непонимаю, что я не так сделал ?

Линковщику надо передавать ключ -n. При раздельной компиляции и компоновке просто дополнительный аргумент у ld, при использовании только gcc вроде бы есть опция командной строки -Xlinker -n.

Author:  andrew_programmer [ Fri Apr 06, 2007 10:58 pm ]
Post subject: 

Всётаки разобрался я с компиляцией.
Оказаывается для компиляции нужно было простенький скриптик для линковщика написать.И ещё модернизировать start.asm, потомучто его вариант для TinyC был непригоден.Ну и как положено Makefile сделал.

Для сравнения.
Программа spektr скомпилированная TinyC имеет размер 23.5 килобайт.При компиляции GCC размер программы 17.5 килобайт.Оптимизация!
Причём как по размеру, так и по скорости.

Author:  andrew_programmer [ Mon Jul 30, 2007 12:28 am ]
Post subject: 

Здравствуйте.

Ранее Халявин Андрей портировал компилятор TinyC для компиляции программ, написанных на C,
под KolibriOS. Но этот компилятор работает из виндовс или линукса, что создаёт неудобства при
разработке программ под Колибри.

Я окончательно портировал TinyC в KolibriOS.Тоесть теперь компилятор TinyC работает из
KolibriOS.

Давздравствует разработка программ на языке высокого уровня прямо из KolibriOS !
http://www.menuetosgame.narod.ru/programs/ktcc.7z

Все сообщения от компилятора выводятся в Console,что намного удобнее доски отладки.
Кстати, портированный компилятор я назвал KTCC(Kolibri Tiny C Compiler).

Для портирования компилятора я использовал библиотеку menuetlibc, которую я доработал
(добавил в библиотеку необходимые для компилятора функции).Исходники портированного KTCC
отличаются от исходников metcc.
http://www.menuetosgame.narod.ru/progra ... ibc_new.7z

Самая большая тестовая программа, которую я скомпилировал при помощи KTCC, -это моя
научная программа spektr.Я скомпилировал её из Колибри, а потом запустил. Программа
успешно работала.

Для компиляции программы необходимо запустить KTCC c параметрами.Пример параметров
вместе с простой тестовой программой содержится в папке example.Запуск компилятора
с параметрами производиться при помощи программы RUN(меню->запуск программ->RUN).
Мне хочется доработать программу CMD, чтобы она понимала относительный путь './'
и принимала cmd скрипты через параметры. Это позволит компилировать при помощи скриптов
даже сложные проекты(где много файлов в разных папках).
Пока что разобраться в коде CMD у меня не очень-то получается.Код не структурирован.
Непонятно, где начинаются и кончаются функции, а где идут просто метки переходов.

Author:  Mario79 [ Mon Jul 30, 2007 7:55 am ]
Post subject: 

andrew_programmer
Хоть я и не пишу на С, но все равно - поздравляю! Удачи.

Author:  Leency [ Mon Jul 30, 2007 8:04 am ]
Post subject: 

andrew_programmer
Да, отличная работа, хоть мне больше по душе Паскаль. + Примеров бы побольше в архиве. :)

Page 6 of 16 All times are UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/