Page 19 of 77

Re: Помогите новичку

Posted: Mon Apr 04, 2011 11:39 am
by CleverMouse
Gluk, мне кажется, ты неправильно понимаешь концепцию динамически загружаемых библиотек. Она относится исключительно к организации кода - какой код в каком файле на диске должен находиться. После того, как библиотека загружена в память, нет разницы между тем, откуда исполняющийся код был загружен - из запускаемого бинарника или из библиотеки, подгруженной позднее. В частности, точно так же можно делать несколько потоков, падение одного из которых никак не влияет на остальные. Реентерабельность вообще никак не связана с динамической загрузкой - если один и тот же код должен обрабатывать несколько разных экземпляров объектов, то ему придётся либо быть реентерабельным, либо очень внимательно следить за используемыми глобальными переменными, независимо от того, в библиотеке он или в отдельной программе.

Re: Помогите новичку

Posted: Mon Apr 04, 2011 11:51 am
by CleverMouse
ChE, libimg загружает файл и конвертирует его в подходящее - с точки зрения libimg - представление. Если на входе был 32-битный PNG, то внутренним представлением будет массив 32-битных цветов, а если PNG был с палитрой, то и внутреннее представление будет использовать палитру. По этой причине работать с внутренним представлением напрямую не рекомендуется; для вывода на экран в libimg есть специальная функция, есть также готовая функция для конвертации в 24bpp. Для конвертации в 32bpp с альфа-каналом готовой функции нет, но если это действительно нужно, правильнее будет добавить аналогичную функцию в libimg.

Re: Помогите новичку

Posted: Mon Apr 04, 2011 1:10 pm
by Gluk
CleverMouse, большое спасибо за разъяснения! Я верно понимаю, что в таком случае нет разницы - использовать библиотеку или самописный бинарный файл (самостоятельно следя за выделением памяти)? Или использование библиотеки дает еще какие-то исключительные преимущества?

Re: Помогите новичку

Posted: Mon Apr 04, 2011 1:26 pm
by Mario
Gluk
Код самописного бинарника не будет "расшариваться" для остальных потоков (потоков разных приложений), тогда как при использовании библиотеки загруженной через системную функцию код проецируется на приложения, до первой попытки приложения записать в эту область. Т.е. при наличии реентерабельной библиотеки она реентерабельна для всех потоков системы, а не только для потоков текущего приложения (которые работают в одном адресном пространстве)

Re: Помогите новичку

Posted: Mon Apr 04, 2011 1:33 pm
by SoUrcerer
Gluk wrote:а где я могу посмотреть коды ошибок ФС? поиск в вики и на форуме результатов не дал
http://wiki.kolibrios.org/wiki/Ru/api/kernel

Поиск разве не работает? : (Хотя все же нужно выделить коды ошибок в отдельную статью)

Re: Помогите новичку

Posted: Mon Apr 04, 2011 1:42 pm
by Gluk
Mario, а, понятно.

Sorcerer, да вроде работает, какие-то странички выдает, но того, что надо я среди них не видел

Re: Помогите новичку

Posted: Mon Apr 04, 2011 1:45 pm
by SoUrcerer
Хм?
http://wiki.kolibrios.org/index.php?tit ... 0%BE%D0%BA

Кажется, в ближайшее время снова серьезно займусь wiki.

Re: Помогите новичку

Posted: Sun Apr 10, 2011 10:31 pm
by Jaeger
1. Как грамотно создать и использовать переменную в стеке?
Пусть, например, переменная занимает 16 байт (всё тот же tp_obj), и мы хотим передать указатель на неё первым параметром в функцию tp_obj tp_fnc(param1, param2);

Code: Select all

sub esp, 16
push param1 ;какие-то параметры
push param2
push esp+24; передаём указатель на нашу переменную
call tp_fnc
add esp, 24; очищаем стек, 4 байта удаляет сама функция
После этого всё работает странно: то ли сбивается указатель стека, то ли что-то затирается, пока точно не выяснил. Но если вместо "push esp+24" передать адрес структуры tp_obj, зарезервированной с помощью rb, то всё работает.

2. Как наиболее эффективно положить в стек 16-байтовую структуру?
Мне приходят на ум такие варианты:
а)

Code: Select all

mov eax, my_structure
push dword[eax+12]
push dword[eax+8]
push dword[eax+4]
push dword[eax]
б)

Code: Select all

mov eax, my_structure+12
mov ecx, 4
label1: push dword[eax]
sub eax,4
loop label1
Для очень больших структур, наверно, оптимальный вариант movs, но для 16-байтовой накладные расходы на установку адресов слишком велики.
Что посоветуете?

Re: Помогите новичку

Posted: Sun Apr 10, 2011 11:53 pm
by art_zh
Jaeger

Code: Select all

push esp+24
ты передаешь в стеке адрес, на который указывал esp до того, как ты запихнул в стек свою структуру.
Правильно будет

Code: Select all

push esp+8
По второму вопросу - всё правильно, хотя могут быть и другие варианты:

Code: Select all

sub esp, 16
fld [eax]
fld [eax+8]
fstp [esp+8]
fstp [esp]

Re: Помогите новичку

Posted: Mon Apr 11, 2011 12:59 pm
by CleverMouse
Jaeger, в системе команд x86 не существует команды push esp+N. Fasm считает плюс разделителем и ассемблирует "push esp+N" так же, как "push esp N", то есть "push esp // push N", что явно не то, что нужно. Например, можно сделать так:

Code: Select all

sub esp, 16
mov eax, esp
push param1
push param2
push eax
call tp_fnc
add esp, 4*3 + 16

Re: Помогите новичку

Posted: Tue Apr 12, 2011 7:42 am
by Asper
Jaeger
А не проще использовать стандартные способы?
Например:

Code: Select all

;....
include 'proc32.inc'

;.....
mov eax, [pointer_to_my_variable]
stdcall tp_fnc, param1, param2, eax
;.....

proc tp_fnc stdcall, arg1:dword, arg2:dword, arg3:dword
;.....
  ret
endp

Re: Помогите новичку

Posted: Sun Apr 24, 2011 2:00 pm
by Gluk
65 функция работает с абсолютными координатами или координатами относительно окна?

Re: Помогите новичку

Posted: Sun Apr 24, 2011 2:09 pm
by SoUrcerer
Function 65 - draw image with palette in the window.

* Coordinates of the image are coordinates of the upper left corner
of the image relative to the window.

Т.е. относительно окна.

Re: Помогите новичку

Posted: Sun Apr 24, 2011 3:53 pm
by Gluk
спасибо...

Re: Помогите новичку

Posted: Mon Aug 08, 2011 11:53 pm
by Leency
Вопрос к веб-разработчикам.
Помогите, пожалуйста, сделать переход javascript:toNext() и javascript:toPrevious() по нажатию влево/вправо на клаве соответственно. Хочу обновить послдний живой неофициальный сайт, посвящённый Колибри до вменяемого состояния.