Page 6 of 20

Posted: Sun Sep 24, 2006 11:18 am
by O01eg
А есть что либо для SVN весящее поменьше, желательно менее 1 МБ?

Posted: Sat Oct 07, 2006 9:05 pm
by Ghost
Вот ещё две интересные особенности :
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;
}

Posted: Sun Oct 08, 2006 10:26 am
by halyavin
Ghost
Не вижу большого смысла в фиче дефолтной установки результата в ноль. А вдруг результат формируется в ассемблерной вставке?
tcc поддерживает #pragma pack - переписал определение структуры с его использованием (попутно обнаружил, что я пропустил одно поле...).

Posted: Tue Feb 27, 2007 2:37 pm
by Serial
Поделитесь пожалуйста файликом start.o

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

Posted: Wed Apr 04, 2007 11:39 pm
by andrew_programmer
Стал я прикручивать интерфейс к программе 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 содержащая некоторые системные функции Колибри, котоые используются мной в программе.

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

Posted: Thu Apr 05, 2007 9:44 am
by Serial
Попробуй использовать void * вместо unsigned int *

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

Posted: Thu Apr 05, 2007 4:43 pm
by andrew_programmer
>Попробуй использовать void * вместо unsigned int *

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


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

Posted: Thu Apr 05, 2007 5:29 pm
by vectoroc
melibc прекрасно компиляется с помощью gcc. И тестовые проги тоже

Posted: Thu Apr 05, 2007 5:43 pm
by andrew_programmer
>melibc прекрасно компиляется с помощью gcc. И тестовые проги тоже

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

Posted: Thu Apr 05, 2007 6:03 pm
by diamond
andrew_programmer wrote:превращаем двоичный файл в бинарник

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

Posted: Fri Apr 06, 2007 10:58 pm
by andrew_programmer
Всётаки разобрался я с компиляцией.
Оказаывается для компиляции нужно было простенький скриптик для линковщика написать.И ещё модернизировать start.asm, потомучто его вариант для TinyC был непригоден.Ну и как положено Makefile сделал.

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

Posted: Mon Jul 30, 2007 12:28 am
by andrew_programmer
Здравствуйте.

Ранее Халявин Андрей портировал компилятор 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 у меня не очень-то получается.Код не структурирован.
Непонятно, где начинаются и кончаются функции, а где идут просто метки переходов.

Posted: Mon Jul 30, 2007 7:55 am
by Mario79
andrew_programmer
Хоть я и не пишу на С, но все равно - поздравляю! Удачи.

Posted: Mon Jul 30, 2007 8:04 am
by Leency
andrew_programmer
Да, отличная работа, хоть мне больше по душе Паскаль. + Примеров бы побольше в архиве. :)