Page 4 of 6
Re: nasm, vc, gcc и другие
Posted: Wed Feb 24, 2010 7:44 pm
by Alexus
KCC v.0.02
Возможности:
1. Синтаксис С++ (функции, структуры, классы) - стандартной библиотеки нет

. как и обёрток для API
2. Прямая трансляция с\срр с автоматическим использованием g++ и fasm (по умолчанию)
3. Трансляция ассемблерного листинга Си или С++ созданного через gcc\g++, в ассемблерную программу для колибри на фасм
Недостатки(крупные навскидку):
1. Нет libc
2. Нет обёрток API ядра
3. Нет удобной обработки переданных параметров
Установка:
скачать и распаковать kcc.pl
user$ mv kcc.pl kcc && chmod +x kcc
root # mv kcc /usr/bin
########
Должен быть установлен gcc [g++] , fasm
Использование...
Прямая трансляция
kcc file.c или kcc file.cpp (рекомендуется)
В папке появиться:
file.s - ассемблерный AT&T листинг
file.asm - ассемблерный Intel листинг для Fasm & KolibriOS
file.bin - бинарный файл колибри
Вручную
gcc -S file.cpp или g++ -S file.cpp
kcc file.s
fasm file.asm
По файлам результат тот же.
Re: nasm, vc, gcc и другие
Posted: Mon Mar 01, 2010 12:55 am
by Alexus
А не мог бы кто поподробнее рассказать как работает передача параметров в программу (те которые _params в macros.inc)? передаётся строка символов включая пробелы или передаётся ссылка на массив строк или как то иначе? Если где-то есть подробное описание прошу извинить меня и дать ссылку .
Re: nasm, vc, gcc и другие
Posted: Mon Mar 01, 2010 6:47 pm
by diamond
Alexus wrote:А не мог бы кто поподробнее рассказать как работает передача параметров в программу (те которые _params в macros.inc)?
Параметры передаются как одна ASCIIZ-строка длиной не более 256 (не считая завершающего нуля). Описано это в документации на функцию запуска программы 70.7.
Re: nasm, vc, gcc и другие
Posted: Fri Mar 05, 2010 2:17 pm
by SHREDER
Alexus wrote:KCC v.0.02
Недостатки(крупные навскидку):
1. Нет libc
2. Нет обёрток API ядра
3. Нет удобной обработки переданных параметров
На самом деле libc существует хотя она далеко не полная (например нет assert), и реализована кривоато. Там-же и обертки для ядра, вплоть до поднятия окон и т.п. Все это "барахло" лежит в SVN вместе с ОС.
Основная лажа klibc - __stdcall (pascal) т.е. параметры сначала передаются в стек, а потом уже ручками в регистры после чего вызывается прерывание - "системный вызов". Это полный ПЭ, потому что нужен-то cdecl и __fascall согласно ISO C99.
Второй момент линковка. Ld вообще-то может собирать не только elf но и все что угодно. Только для этого ему нужно подсунуть специальный скрипт, указывающий формат бинарника . Такого скрипта в общем доступе нет, но вот .o-FASM подход интересный.
Момент третий, G++ голый т.е. libstdc++ (в мс это crt) отсутствует т.е. фактически на С++ писать программы по KOS не реально.
Собственно процесс пошел наконец-то. Предлагаю создать полный пакет binutils и получить рабочий gcc наконец.
Re: nasm, vc, gcc и другие
Posted: Fri Mar 05, 2010 2:23 pm
by SHREDER
diamond wrote:Alexus wrote:А не мог бы кто поподробнее рассказать как работает передача параметров в программу (те которые _params в macros.inc)?
Параметры передаются как одна ASCIIZ-строка длиной не более 256 (не считая завершающего нуля). Описано это в документации на функцию запуска программы 70.7.
А можно в некотором новом релизе ядра выделить байта 4 на строку?
Re: nasm, vc, gcc и другие
Posted: Fri Mar 05, 2010 2:36 pm
by Mario
SHREDER wrote:
А можно в некотором новом релизе ядра выделить байта 4 на строку?
Этот как? Подробнее можно описать?
Re: nasm, vc, gcc и другие
Posted: Fri Mar 05, 2010 2:43 pm
by diamond
SHREDER wrote:т.е. фактически на С++ писать программы по KOS не реально.
Таким образом, порта dosbox не существует.
SHREDER wrote:Второй момент линковка. Ld вообще-то может собирать не только elf но и все что угодно. Только для этого ему нужно подсунуть специальный скрипт, указывающий формат бинарника . Такого скрипта в общем доступе нет
Есть. Собственно, заглавный пост этой темы - ссылка на статью, в которой такой скрипт упомянут.
Mario wrote:Подробнее можно описать?
Угу, я тоже не понял.
Re: nasm, vc, gcc и другие
Posted: Fri Mar 05, 2010 3:24 pm
by Alexus
SHREDER wrote:Alexus wrote:KCC v.0.02
Недостатки(крупные навскидку):
1. Нет libc
2. Нет обёрток API ядра
3. Нет удобной обработки переданных параметров
На самом деле libc существует хотя она далеко не полная (например нет assert), и реализована кривоато. Там-же и обертки для ядра, вплоть до поднятия окон и т.п. Все это "барахло" лежит в SVN вместе с ОС.
Основная лажа klibc - __stdcall (pascal) т.е. параметры сначала передаются в стек, а потом уже ручками в регистры после чего вызывается прерывание - "системный вызов". Это полный ПЭ, потому что нужен-то cdecl и __fascall согласно ISO C99.
Второй момент линковка. Ld вообще-то может собирать не только elf но и все что угодно. Только для этого ему нужно подсунуть специальный скрипт, указывающий формат бинарника . Такого скрипта в общем доступе нет, но вот .o-FASM подход интересный.
Момент третий, G++ голый т.е. libstdc++ (в мс это crt) отсутствует т.е. фактически на С++ писать программы по KOS не реально.
Собственно процесс пошел наконец-то. Предлагаю создать полный пакет binutils и получить рабочий gcc наконец.
Мне кажется или это было не про kcc? =) у меня libc точно нет, тк пока бессмысленно её писать по нескольким причинам:
1) нет механизма передачи параметров через argv[ ], argc (сейчас именно этим и занимаюсь)
2) нет механизма создания динамических библиотек и их подключения (3й пункт для выпуска 0.03)
Я делаю это всё в 1ую очередь для себя тк хочу иметь свой привычный инструмент, сейчас я медленно нарабатываю базу заодно изучая как работает gcc\g++ , синтаксисы Intel и AT&T. К версии 0.4 - 0.5 наработав базу определённую уже буду пытаться писать libc( заодно разберусь что да как там и как работает =) ) и приводить в соответствие флаги.
Возможно меня по ошибке процитировали, но я решил высказать по поводу этого недоразумения

, и да если и есть наработки libc мне они не особо подходят тк они в Intel синтаксисе, а мне нужно в AT&T , хотя как пример на них можно смотреть.
P.S. если я чего не понял, прошу извинить
Re: nasm, vc, gcc и другие
Posted: Fri Mar 05, 2010 3:43 pm
by Serge
Скрипт для LD под Mingw32. Собираем с ключами -static -nostdlib --stack сколько_стека_в_байтах
extern char __cmdline[]; и extern char __pgmname[]; дают доступ к командной строке и полному пути.
Code: Select all
ENTRY(___crt_startup)
SECTIONS
{
.text 0x000000:
{
LONG(0x554e454D);
LONG(0x32305445);
LONG(1);
LONG(___crt_startup);
LONG(___iend);
LONG(___memsize);
LONG(___stacktop);
LONG(___cmdline);
LONG(___pgmname); /* application path */
LONG(0) /* tls info */
*(.init)
*(.text)
*(SORT(.text$*))
*(.rdata)
*(SORT(.rdata$*))
*(.glue_7t)
*(.glue_7)
___CTOR_LIST__ = .; __CTOR_LIST__ = .;
LONG (-1); *(SORT(.ctors.*)); *(.ctors); *(.ctor); LONG (0);
___DTOR_LIST__ = .; __DTOR_LIST__ = .;
LONG (-1); *(SORT(.dtors.*)); *(.dtors); *(.dtor); LONG (0);
}
.CRT ALIGN(16) :
{
___crt_xc_start__ = . ;
*(SORT(.CRT$XC*)) /* C initialization */
___crt_xc_end__ = . ;
___crt_xi_start__ = . ;
*(SORT(.CRT$XI*)) /* C++ initialization */
___crt_xi_end__ = . ;
___crt_xl_start__ = . ;
*(SORT(.CRT$XL*)) /* TLS callbacks */
/* ___crt_xl_end__ is defined in the TLS Directory support code */
___crt_xp_start__ = . ;
*(SORT(.CRT$XP*)) /* Pre-termination */
___crt_xp_end__ = . ;
___crt_xt_start__ = . ;
*(SORT(.CRT$XT*)) /* Termination */
___crt_xt_end__ = . ;
}
.data ALIGN(16) :
{
*(.data)
. = ALIGN(16);
___iend = . ;
}
.bss ALIGN(4096):
{
*(.bss)
*(COMMON)
. = ALIGN(16);
___cmdline = .;
. = . + 256;
___pgmname = .;
. = . + 1024 + __size_of_stack_reserve__ ; /* --stack RESERVE */
___stacktop = .;
}
___memsize = . ;
}
и примерный crt0.c
Code: Select all
void _exit(int __status) __attribute__((noreturn));
extern char __cmdline[];
extern char __pgmname[]
void __attribute__((noreturn))
__crt_startup (void)
{
char *argv[2];
int argc;
__asm__ __volatile__(
"int $0x40"
:"=eax"(nRet)
:"a"(68),"b"(11));
argv[0] = __pgmname;
if( __cmdline[0] != 0)
{
argc = 2;
argv[1] = __cmdline;
} else argc = 1;
_exit( main (argc, argv, NULL));
};
void _exit(int __status)
{
while(1){
__asm__ __volatile__(
"int $0x40"
::"a"(-1));
};
}
Re: nasm, vc, gcc и другие
Posted: Sat Mar 06, 2010 3:07 pm
by SHREDER
argv[ ], argc? Как это мешает libc в упор не пойму. И вообще кто сказал что
int main(int argc,const char **argv) единственно возможная декларация main?
Ну а с синтаксисом ассемблера "на вкус и цвет" как говорится. По моему глубочайшему ИМХО intel намного более прост. Если охота посмотреть на libc под GAS то смотри суда
http://sourceforge.net/projects/menuetlibc/
Re: nasm, vc, gcc и другие
Posted: Sat Mar 06, 2010 3:09 pm
by SHREDER
Serge wrote:Скрипт для LD под Mingw32. Собираем с ключами -static -nostdlib --stack сколько_стека_в_байтах
extern char __cmdline[]; и extern char __pgmname[]; дают доступ к командной строке и полному пути.
Code: Select all
ENTRY(___crt_startup)
SECTIONS
{
.text 0x000000:
{
LONG(0x554e454D);
LONG(0x32305445);
LONG(1);
LONG(___crt_startup);
LONG(___iend);
LONG(___memsize);
LONG(___stacktop);
LONG(___cmdline);
LONG(___pgmname); /* application path */
LONG(0) /* tls info */
*(.init)
*(.text)
*(SORT(.text$*))
*(.rdata)
*(SORT(.rdata$*))
*(.glue_7t)
*(.glue_7)
___CTOR_LIST__ = .; __CTOR_LIST__ = .;
LONG (-1); *(SORT(.ctors.*)); *(.ctors); *(.ctor); LONG (0);
___DTOR_LIST__ = .; __DTOR_LIST__ = .;
LONG (-1); *(SORT(.dtors.*)); *(.dtors); *(.dtor); LONG (0);
}
.CRT ALIGN(16) :
{
___crt_xc_start__ = . ;
*(SORT(.CRT$XC*)) /* C initialization */
___crt_xc_end__ = . ;
___crt_xi_start__ = . ;
*(SORT(.CRT$XI*)) /* C++ initialization */
___crt_xi_end__ = . ;
___crt_xl_start__ = . ;
*(SORT(.CRT$XL*)) /* TLS callbacks */
/* ___crt_xl_end__ is defined in the TLS Directory support code */
___crt_xp_start__ = . ;
*(SORT(.CRT$XP*)) /* Pre-termination */
___crt_xp_end__ = . ;
___crt_xt_start__ = . ;
*(SORT(.CRT$XT*)) /* Termination */
___crt_xt_end__ = . ;
}
.data ALIGN(16) :
{
*(.data)
. = ALIGN(16);
___iend = . ;
}
.bss ALIGN(4096):
{
*(.bss)
*(COMMON)
. = ALIGN(16);
___cmdline = .;
. = . + 256;
___pgmname = .;
. = . + 1024 + __size_of_stack_reserve__ ; /* --stack RESERVE */
___stacktop = .;
}
___memsize = . ;
}
и примерный crt0.c
Code: Select all
void _exit(int __status) __attribute__((noreturn));
extern char __cmdline[];
extern char __pgmname[]
void __attribute__((noreturn))
__crt_startup (void)
{
char *argv[2];
int argc;
__asm__ __volatile__(
"int $0x40"
:"=eax"(nRet)
:"a"(68),"b"(11));
argv[0] = __pgmname;
if( __cmdline[0] != 0)
{
argc = 2;
argv[1] = __cmdline;
} else argc = 1;
_exit( main (argc, argv, NULL));
};
void _exit(int __status)
{
while(1){
__asm__ __volatile__(
"int $0x40"
::"a"(-1));
};
}
Пасиб, хотя и поздновато немного.
Re: nasm, vc, gcc и другие
Posted: Sat Mar 06, 2010 8:24 pm
by Alexus
SHREDER wrote:argv[ ], argc? Как это мешает libc в упор не пойму. И вообще кто сказал что
int main(int argc,const char **argv) единственно возможная декларация main?
Ну а с синтаксисом ассемблера "на вкус и цвет" как говорится. По моему глубочайшему ИМХО intel намного более прост. Если охота посмотреть на libc под GAS то смотри суда
http://sourceforge.net/projects/menuetlibc/
Это объявление является классическим, поэтому ориентируюсь я на него.
Ассемблер у меня не на вкус и цвет, а по той причине что встроенный(inline) ассемблер в gcc\g++ имеет AT&T синтаксис...
Re: nasm, vc, gcc и другие
Posted: Sat Mar 13, 2010 9:04 pm
by diamond
Обновилась menuetlibc по адресу
http://diamond.kolibrios.org/menuetlibc.7z. В новой версии: разные багфиксы; в рамках интеграции с другими изменениями (судя по changelog'у, их автором был vectoroc) главная функция приложения переименована из app_main в main; некоторые примитивные вещи из stl (типа std::vector<std::string> с минимальной функциональностью, достаточной для компиляции dosbox'а); улучшена совместимость с gcc4, с 64-битными системами, кроме того, заголовочные файлы нормально понимает VC.
P.S. Для ярых любителей linux сообщаю, что версия тестировалась, помимо mingw и cygwin, на паре разных линухов, один был 32-битным, другой 64-битным.
Re: nasm, vc, gcc и другие
Posted: Thu Apr 08, 2010 4:56 pm
by staper
diamond wrote:заголовочные файлы нормально понимает VC.
Если интеграция с VC возможна, не поясните как?
Re: nasm, vc, gcc и другие
Posted: Fri Apr 09, 2010 4:58 pm
by diamond
staper
А в чём проблема? VC нормально понимает библиотеки, сгенерированные gcc.