Tiny C Compiler
-
А есть что либо для SVN весящее поменьше, желательно менее 1 МБ?
Вот ещё две интересные особенности :
1) Функция такого вода скомпилируется без проблем, но возвращает неопределённо значение, а вовсе не 0 как многие другие компилеры.
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 а совсем другое, и пользоватся структурои невозможно.
Писать полную реализацию мне некогда/незачем, для себя использовал такой код :
1) Функция такого вода скомпилируется без проблем, но возвращает неопределённо значение, а вовсе не 0 как многие другие компилеры.
Code: Select all
int func(){
}
а) структура 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 - переписал определение структуры с его использованием (попутно обнаружил, что я пропустил одно поле...).
Не вижу большого смысла в фиче дефолтной установки результата в ноль. А вдруг результат формируется в ассемблерной вставке?
tcc поддерживает #pragma pack - переписал определение структуры с его использованием (попутно обнаружил, что я пропустил одно поле...).
Поделитесь пожалуйста файликом start.o
Пожалуйста: http://diamondz.land.ru/start.o
А в чём, собственно, проблема с компиляцией? В папке start достаточно сказать "fasm start.asm".
А в чём, собственно, проблема с компиляцией? В папке 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 содержащая некоторые системные функции Колибри, котоые используются мной в программе.
Пожалуйста помогите советом - мне это очень нужно.
Я делал всё правильно(соблюдал все типы данных).Но 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 не пробовал). Но и там была туева хуча проблем
А вообще у меня получилось писать на сишке для Kolibri только в Visual Studio 2005 (gcc не пробовал). Но и там была туева хуча проблем
>Попробуй использовать void * вместо unsigned int *
В моём случае так делать нельзя.Потому что у меня структура - это тип данных.И если в одном из её полей организовать указатель типа void* , то компилятор не моймёт какого размера она должна быть(структура).
Тоесть имеется структура закладка, некоторые из полей которой являются указателями на другие структуры.К примеру структуры кнопки или чекбокса.GCC нормально понимает мой код, а TinyC нет.Помоему это связано с ошибкой в компиляторе.Тем более, что Халявин
Андрей(halyvin) уже находил некоторые ошибки.
Неужели на этом форуме нет людей умеющих компилировать код под Колибри при помощи GCC ?
В моём случае так делать нельзя.Потому что у меня структура - это тип данных.И если в одном из её полей организовать указатель типа void* , то компилятор не моймёт какого размера она должна быть(структура).
Тоесть имеется структура закладка, некоторые из полей которой являются указателями на другие структуры.К примеру структуры кнопки или чекбокса.GCC нормально понимает мой код, а TinyC нет.Помоему это связано с ошибкой в компиляторе.Тем более, что Халявин
Андрей(halyvin) уже находил некоторые ошибки.
Неужели на этом форуме нет людей умеющих компилировать код под Колибри при помощи GCC ?
melibc прекрасно компиляется с помощью gcc. И тестовые проги тоже
>melibc прекрасно компиляется с помощью gcc. И тестовые проги тоже
У меня давно melibc установлена и тестовые программы тоже.
Хочет того программа или нет, но ко всем тестовым программам(и не только) линкуются функции из melibc.
При компиляции моей программы spektr происходит конфликт между функциями из melibc и функциями из k_lib.o
Это функции работы с памятью.
Также возникают проблемы с экспортируемыми __argv и __argc.Они содержаться в объектнике start, который формирует свой заголовок программы, что опять приводит к конфликту.
Поэтому мне нужен вариант сборки программы без использования melibc и без соответствующих скриптов для неё.
У меня давно melibc установлена и тестовые программы тоже.
Хочет того программа или нет, но ко всем тестовым программам(и не только) линкуются функции из melibc.
При компиляции моей программы spektr происходит конфликт между функциями из melibc и функциями из k_lib.o
Это функции работы с памятью.
Также возникают проблемы с экспортируемыми __argv и __argc.Они содержаться в объектнике start, который формирует свой заголовок программы, что опять приводит к конфликту.
Поэтому мне нужен вариант сборки программы без использования melibc и без соответствующих скриптов для неё.
Линковщику надо передавать ключ -n. При раздельной компиляции и компоновке просто дополнительный аргумент у ld, при использовании только gcc вроде бы есть опция командной строки -Xlinker -n.andrew_programmer wrote:превращаем двоичный файл в бинарник
objcopy ./spektr -O binary
у меня получился бинарный файл spektr, но это не был исполняемый файл Колибри.Я непонимаю, что я не так сделал ?
Всётаки разобрался я с компиляцией.
Оказаывается для компиляции нужно было простенький скриптик для линковщика написать.И ещё модернизировать start.asm, потомучто его вариант для TinyC был непригоден.Ну и как положено Makefile сделал.
Для сравнения.
Программа spektr скомпилированная TinyC имеет размер 23.5 килобайт.При компиляции GCC размер программы 17.5 килобайт.Оптимизация!
Причём как по размеру, так и по скорости.
Оказаывается для компиляции нужно было простенький скриптик для линковщика написать.И ещё модернизировать 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 у меня не очень-то получается.Код не структурирован.
Непонятно, где начинаются и кончаются функции, а где идут просто метки переходов.
Ранее Халявин Андрей портировал компилятор 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 3 guests