Решил ещё попробовать использовать функции из
masm32lib.
Здесь есть проблема:
masm декорирует
stdcall-функции.
Попробовал объявлять так
Code: Select all
extern WINAPI ""
{
_FloatToStr@12 ;
}
но такая конструкция всё равно не заработала
есть вариант пересобрать
masm32.lib с помощью
masm-совместимого
uasm(
http://www.terraspace.co.uk/uasm.html)
у
uasm есть ключик для отключения декорирования
stdcall-функций
Code: Select all
-zt<0|1|2> Set STDCALL symbol decoration: 0=No name decoration,
1=No '@size' suffix for functions, 2=Full (default)
в самом
masm я такой возможности не обнаружил
тогда в
make.bat из папки
masm32\m32lib для
masm32.lib надо будет заменить эту строку
на эту
Всё успешно собралось.
Если вдруг кому надо
Это всего лишь пересобранная версия, так что,
Windows-специфичные функции(FrameWindow, DisplayIcon, ...) работать не будут.
Вот такой код вполне работает
Spoiler:
Code: Select all
// Import from KolibriOS.lib:
extern void stdcall ThreadTerminate();
extern dword stdcall LoadLibrary(char* Path);
extern dword stdcall GetProcAddress(dword hLib; char* ProcName);
// Import from masm32.lib:
extern void stdcall FloatToStr(double fpin, char* szDbl);
dword hConsole;
void stdcall (*ConsoleInit)(dword WndWidth, WndHeight, ScrWidth, ScrHeight; char* Caption);
void stdcall (*ConsoleExit)(dword bCloseWindow);
void stdcall (*Write)(char* string);
#define PI (double)3.14159265359
#define E (double)2.71828182846
void Main(){
char buf[20];
hConsole = LoadLibrary("/sys/lib/console.obj");
ConsoleInit = GetProcAddress(hConsole, "con_init");
ConsoleExit = GetProcAddress(hConsole, "con_exit");
Write = GetProcAddress(hConsole, "con_write_asciiz");
ConsoleInit(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, "Test");
FloatToStr(1.5, #buf); Write(#buf); Write("\n");
FloatToStr(-13.42, #buf); Write(#buf); Write("\n");
FloatToStr(2.71e2, #buf); Write(#buf); Write("\n");
FloatToStr(0.1234E-13, #buf); Write(#buf); Write("\n");
FloatToStr(PI, #buf); Write(#buf); Write("\n");
FloatToStr(E, #buf); Write(#buf); Write("\n");
ConsoleExit(0);
ThreadTerminate();
}
только похоже, что вывод
PI и
E был короче, чем
double.
Spoiler:
-
masm32lib.PNG (3.03 KiB)
Viewed 12290 times
вероятно,
C-- не поддерживает
double в полной мере.
Размер получился немного больше, так как, судя по map-файлу кроме
fptoa также был включен
atofp из-за того что там находится функция
PowerOf10.
Может, что-то можно было ещё у
C-- или у
LD подкрутить, чтобы обойтись без пересборки
masm32.lib.
Но в любом случае есть возможность использовать код из
masm32.lib
У масм-совместимого
uasm там, кстати, даже такой ключик есть
Code: Select all
-Zne Disable syntax extensions not supported by Masm
Для сборки примера также нужна
KolibriOS.lib, взять её можно в теме
Delphi7 examples http://board.kolibrios.org/viewtopic.php?f=33&t=3469