В помощь тем кто смотрит в сторону c++.
Возникшие у меня проблемы:
при объявлении в фасме метки memory как public она неправильное значение имеет в c++ программе: решение:
функция вроде:
getMemory:
mov eax,Memory
ret
C++ изрядно искажает имена, поэтому для вызова main() можно
использовать такую страшную конструкцию

:
extern void meMain() asm("meMain");
void meMain(){
//<реализация>
}
Соответственно вместо meMain в asm("meMain") можно выбрать любое имя какое вам подуше,

и именно этим идентификатором пользоваться в ассемблерном старт-ап коде.
Сисфункции я реализовываю с помошью инлайн ассемблера, например так:
void meos_debug_print(const char* data){
do{
asm volatile ("movl $63,%%eax\n\
movl $1,%%ebx\n\
movb %0,%%cl\n\
int $0x40\
"::"rig"(*data):"eax","ebx","ecx");
}while(*(data++));
}
Вам придется перегрузить глобальные операторы new,delete(ну и их вариации) и написать собственные функции malloc free (когда мой вариант будет не так страшен, выложу, вместе с SIKWL`ом для с++).
Для Виртуальных ф-й в линкер скрипт следует включить запись секции .rdata*:
ENTRY(Start)
SECTIONS
{
// cut
.data : {
*(.data)
}
.rdata:{
*(.rdata*)
}
//cut
}
rtti и исключения не доступны следовательно компилятору следует передать параметры -fno-rtti -fno-exceptions. На некоторых сборках может потребоваться -fno-check-new (непроверять что new возвратил не 0).
Да, все выше перечисленное компилер специфик для gcc3.*?
В процессе написания рантайм библиотека для поддержки исключений в моей сборке g++ используются ф-ии аля unwind_sjlj_register.
После релиза рантайм библиотеки будет зарелизен сиквел (мож даже чуть раньше, и потом версия с исключениями

)[/quote]