Page 12 of 15
Re: C--
Posted: Wed May 14, 2014 10:21 pm
by Alexus
Приветствую, почему-то не получется из С-- обратиться к SysFn68.22, не подскажете где ошибаюсь?
char *buff_name="SHELLY";
result=createMemoryBuffer(buff_name, 1024*16, SHM_OPEN_ALWAYS);
closeMemoryBuffer(buff_name);
int createMemoryBuffer(dword name, int size, dword flags) {
$mov eax,68;
$mov ebx,22;
ECX=name;
EDX=size;
ESI=flags;
$int 0x40
return EDX;
}
void closeMemoryBuffer(dword ECX) {
$mov eax,68;
$mov ebx,23;
$int 0x40
}
Долго боролся получая ошибку 33(Неправильные параметры), теперь имею 30(Не хватает памяти, что сомнительно тк её 4гб).
Re: C--
Posted: Wed May 14, 2014 10:42 pm
by Mario_r4
68.11 ?
Re: C--
Posted: Wed May 14, 2014 11:11 pm
by Alexus
Mario_r4 wrote:68.11 ?
Разьве они связаны? В описании прописаны 12 и 13 только как связанные...
Re: C--
Posted: Wed May 14, 2014 11:35 pm
by 0CodErr
Alexus wrote:Разьве они связаны? В описании прописаны 12 и 13 только как связанные...
http://websvn.kolibrios.org/filedetails ... ]Замечания:
* Предварительно следует инициализировать кучу процесса вызовом
подфункции 11.[/quote]
http://websvn.kolibrios.org/filedetails ... te]Remarks:
* Before this call one must initialize process heap by call to
subfunction 11.[/quote]
Re: C--
Posted: Wed May 14, 2014 11:53 pm
by Alexus
Все получилось, спасибо, надо поправить в Wiki, там этот момент отсуствует.
Re: C--
Posted: Thu May 15, 2014 12:17 am
by punk_joker
Alexus wrote:Все получилось, спасибо, надо поправить в Wiki, там этот момент отсуствует.
Где надо поправить? Да и обертки для функций работы с память для С-- давно уж как написаны
http://websvn.kolibrios.org/filedetails ... ib%2Fmem.h
Re: C--
Posted: Thu May 15, 2014 9:41 am
by Alexus
В wiki которая первая выходит в гугле по запросу kolibrios api:
http://wiki.kolibrios.org/wiki/SysFn68/ ... 1.81.D0.B0.
Эти обертки я видел, для 22 и 23 подфункции там нет.
P.S. Нашел "You can find the latest API documentation in /kernel/docs/ in the SVN repository (WebSVN)" , извиняюсь. Но оберток все равно нет для 22 и 23 =).
Re: C--
Posted: Thu May 15, 2014 1:24 pm
by Alexus
Есть ли где-нибудь примеры использования именованной области на С--? Вроде все правильно сделано и EDX=0(ошибки нет), но при этом EAX вместо адреса именованной области отдает 0, что значит ошибку =\
Re: C--
Posted: Thu May 15, 2014 2:05 pm
by 0CodErr
Alexus, ты бы лучше привёл конкретный код.
Пока что, если исходить из кода, приведённого несколькими постами выше:
Alexus wrote:return EDX;
скорее всего будет преобразовано в
при создании новой области (SHM_CREATE или SHM_OPEN_ALWAYS):
edx = 0 - успех, иначе - код ошибки
Ну вот и получается: успех -> edx=0 -> mov eax, edx -> eax=0
Re: C--
Posted: Thu May 15, 2014 5:04 pm
by Alexus
Код:
http://pastebin.com/PJjdgPEc , извиняюсь за бардак.
В EAX всегда идет 0, или я чего-то не понимаю или я запутался в указателях =\. Вероятнее всего второе..
Re: C--
Posted: Thu May 15, 2014 5:31 pm
by 0CodErr
Code: Select all
error=EDX;
; .......................
return error;
Code: Select all
mov [error], edx
; .......................
mov eax, [error]
Если область создана успешно, то edx=0.
Если edx=0, то после
error=EDX в error тоже будет 0.
Если error=0, то после
return error в eax тоже будет 0.
Re: C--
Posted: Thu May 15, 2014 5:53 pm
by Alexus
Да, но если область создана то до return её адрес будет в eax,
откуда он записывается в buff,
если ошибки нет error=0, то адрес на который указывает buffer меняется на содержащийся в buff.
Но в итоге при error=0, я имею адрес буфера=0
Re: C--
Posted: Thu May 15, 2014 7:43 pm
by 0CodErr
Может быть, на самом деле, error<>0?
превращается в
Code: Select all
8B4D14 mov ecx,[ebp+14h]
0FBE09 movsx ecx,[ecx]
последняя команда знаково расширяет байт(0F
BE09) по адресу в ecx
в int2str:
превращается в
Code: Select all
0FBE8500FFFFFF movsx eax,[ebp-100h]
даже если бы возвращался адрес, возвращать адрес на стеке — плохая идея
ну и дальше пошло-поехало
Re: C--
Posted: Sun Dec 13, 2015 4:36 pm
by Leency
Базовая поддержка коллекций строк (lib/collections.h)
Коллекции похожи на массивы. Работает все до безобразия просто.
Code: Select all
void main()
{
collection s;
s.init(4096);
s.add("lorem");
s.add("ipsum");
s.add("1234566");
debugln(s.get(0)); //-> "lorem"
debugln(s.get(1)); //-> "ipsum"
debugln(s.get(2)); //-> "123456"
}
Ограничения: максимум 4096 элементов, нужно знать размер буфера заранее.
Пример есть в папке CMM/examples/collections.c
Re: C--
Posted: Thu Jan 07, 2016 7:04 pm
by Leency
+ lib/menu.h
+ examples/menu.c
Стандартный компонент меню и пример использования.