Tiny C Compiler

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

    Code: Select all

    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: Select all

    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;
    }
  • Ghost
    Не вижу большого смысла в фиче дефолтной установки результата в ноль. А вдруг результат формируется в ассемблерной вставке?
    tcc поддерживает #pragma pack - переписал определение структуры с его использованием (попутно обнаружил, что я пропустил одно поле...).
  • Поделитесь пожалуйста файликом start.o
  • Пожалуйста: http://diamondz.land.ru/start.o
    А в чём, собственно, проблема с компиляцией? В папке start достаточно сказать "fasm start.asm".
    Ушёл к умным, знающим и культурным людям.
  • Стал я прикручивать интерфейс к программе 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 содержащая некоторые системные функции Колибри, котоые используются мной в программе.

    Пожалуйста помогите советом - мне это очень нужно.
  • Попробуй использовать void * вместо unsigned int *

    А вообще у меня получилось писать на сишке для Kolibri только в Visual Studio 2005 (gcc не пробовал). Но и там была туева хуча проблем :(
  • >Попробуй использовать void * вместо unsigned int *

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


    Неужели на этом форуме нет людей умеющих компилировать код под Колибри при помощи GCC ?
  • melibc прекрасно компиляется с помощью gcc. И тестовые проги тоже
  • >melibc прекрасно компиляется с помощью gcc. И тестовые проги тоже

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

    objcopy ./spektr -O binary
    у меня получился бинарный файл spektr, но это не был исполняемый файл Колибри.Я непонимаю, что я не так сделал ?
    Линковщику надо передавать ключ -n. При раздельной компиляции и компоновке просто дополнительный аргумент у ld, при использовании только gcc вроде бы есть опция командной строки -Xlinker -n.
  • Всётаки разобрался я с компиляцией.
    Оказаывается для компиляции нужно было простенький скриптик для линковщика написать.И ещё модернизировать start.asm, потомучто его вариант для TinyC был непригоден.Ну и как положено Makefile сделал.

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

    Ранее Халявин Андрей портировал компилятор 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 у меня не очень-то получается.Код не структурирован.
    Непонятно, где начинаются и кончаются функции, а где идут просто метки переходов.
  • andrew_programmer
    Хоть я и не пишу на С, но все равно - поздравляю! Удачи.
  • andrew_programmer
    Да, отличная работа, хоть мне больше по душе Паскаль. + Примеров бы побольше в архиве. :)
  • Who is online

    Users browsing this forum: No registered users and 8 guests