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

Applications development, KoOS API questions
  • ChE, libimg загружает файл и конвертирует его в подходящее - с точки зрения libimg - представление. Если на входе был 32-битный PNG, то внутренним представлением будет массив 32-битных цветов, а если PNG был с палитрой, то и внутреннее представление будет использовать палитру. По этой причине работать с внутренним представлением напрямую не рекомендуется; для вывода на экран в libimg есть специальная функция, есть также готовая функция для конвертации в 24bpp. Для конвертации в 32bpp с альфа-каналом готовой функции нет, но если это действительно нужно, правильнее будет добавить аналогичную функцию в libimg.
    Сделаем мир лучше!
  • CleverMouse, большое спасибо за разъяснения! Я верно понимаю, что в таком случае нет разницы - использовать библиотеку или самописный бинарный файл (самостоятельно следя за выделением памяти)? Или использование библиотеки дает еще какие-то исключительные преимущества?
    И мы уже давно не пешки,
    Мы пули, мы орлы, и решки!
    Война ютит бинарный код,
    Умри, или иди вперед!
  • Gluk
    Код самописного бинарника не будет "расшариваться" для остальных потоков (потоков разных приложений), тогда как при использовании библиотеки загруженной через системную функцию код проецируется на приложения, до первой попытки приложения записать в эту область. Т.е. при наличии реентерабельной библиотеки она реентерабельна для всех потоков системы, а не только для потоков текущего приложения (которые работают в одном адресном пространстве)
  • Gluk wrote:а где я могу посмотреть коды ошибок ФС? поиск в вики и на форуме результатов не дал
    http://wiki.kolibrios.org/wiki/Ru/api/kernel

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

    Sorcerer, да вроде работает, какие-то странички выдает, но того, что надо я среди них не видел
    И мы уже давно не пешки,
    Мы пули, мы орлы, и решки!
    Война ютит бинарный код,
    Умри, или иди вперед!
  • Хм?
    http://wiki.kolibrios.org/index.php?tit ... 0%BE%D0%BA

    Кажется, в ближайшее время снова серьезно займусь wiki.
  • 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-байтовой накладные расходы на установку адресов слишком велики.
    Что посоветуете?
  • 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]
  • 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
    
    Сделаем мир лучше!
  • 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
    
  • 65 функция работает с абсолютными координатами или координатами относительно окна?
    И мы уже давно не пешки,
    Мы пули, мы орлы, и решки!
    Война ютит бинарный код,
    Умри, или иди вперед!
  • 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.

    Т.е. относительно окна.
  • спасибо...
    И мы уже давно не пешки,
    Мы пули, мы орлы, и решки!
    Война ютит бинарный код,
    Умри, или иди вперед!
  • Вопрос к веб-разработчикам.
    Помогите, пожалуйста, сделать переход javascript:toNext() и javascript:toPrevious() по нажатию влево/вправо на клаве соответственно. Хочу обновить послдний живой неофициальный сайт, посвящённый Колибри до вменяемого состояния.
    Attachments
    SlideShow.zip (49.05 KiB)
    Downloaded 263 times
    Из хаоса в космос
  • Who is online

    Users browsing this forum: No registered users and 0 guests