Page 1 of 2

Платформонезависимые библиотеки

Posted: Wed Mar 18, 2009 9:45 pm
by Albom
Появилась идея перенести в Колибри несколько платформонезависимых библиотек.
У меня есть библиотеки как своего кода, так и чужого. В свободное время буду понемногу портировать... Кому интересно - присоединяйтесь...

Сегодня собрал библиотеку быстрой сортировки. Поддерживаются все типы данных. Передача параметров - stdcall. Есть пример использования.

Re: Платформонезависимые библиотеки

Posted: Thu Mar 19, 2009 1:12 am
by IgorA
2 вопроса:
Коды на С++, а можно ли их преобразовать в asm, или они сразу в obj компилятся ?
Это случайно не алгоритм сортировки методом Флойда ?

Re: Платформонезависимые библиотеки

Posted: Thu Mar 19, 2009 7:26 am
by Albom
IgorA
1) преобразовать-то можно всегда (я даже так пробовал). только зачем? выигрыша по скорости мы не получим, а по размеру выигрыш будет несущественный (ну будет не 3 кБ, а 2). зато для восприятия проще код, написанный вручную, а не сгенерированный компилятором (особенно ужасно читать метки циклов - не будешь же сидеть и придумывать осмысленные имена?...). компилировать в obj можно сразу. я использую gcc (MinGW).
2) нет, это классическая быстрая сортировка

Re: Платформонезависимые библиотеки

Posted: Thu Mar 19, 2009 12:04 pm
by IgorA
преобразовать-то можно всегда (я даже так пробовал). только зачем?
За тем чтобы лучше изучить ассемблер. Есть много вопросов, которые я могу запрограммировать на С++, и не могу тоже самое сделать на asm. А преобразовать в asm, пусть даже автоматом, и понять что как делается это интересно.
Например: как сделать локальную переменную внутри функции, как программировать операции с плавающей точкой через сопроцессор... и т. д. Если можно преобразовать из С++ в asm то это очень хорошо.

Re: Платформонезависимые библиотеки

Posted: Thu Mar 19, 2009 12:56 pm
by Veliant
2Igora:
Локальная переменная например так

Code: Select all

function:
    jmp @b
        .var dd 0
    @@:
ret
или просто вынести перед функцией
операции с плавающей точкой - про FPU надо читать
(сопроцессор стековый потому вся работа с верхними ячейками стека)
FLD - загрузить вещественное число в стек
FILD - загрузить целое число в стек
FST - считать из стека
FIST - считать из стека целое
FADD - сложение
FSUB - вычитание
FMUL - умножение
FDIV - деление

а вообще у зубкова всё это есть))

Re: Платформонезависимые библиотеки

Posted: Thu Mar 19, 2009 1:04 pm
by vkos
Veliant wrote:

Code: Select all

function:
    jmp @b
        .var dd 0
    @@:
ret
Не @b, а @f.

Re: Платформонезависимые библиотеки

Posted: Thu Mar 19, 2009 1:12 pm
by Serge
Veliant

Локальные переменные размещаются в стеке, а не в сегменте кода

Code: Select all

include 'proc32.inc'

proc some_func stdcall, param1:dword, param2:dword; etc
           locals
             var1         dd ?
             var2         dd ?
             var3         dd ?
           endl

          mov eax, [param1]
          add eax, [param2]
          mov [var1], eax
          ...
          ...        
          ret
endp

;вызывем
         stdcall some_func, eax, ecx
  
Можно объявить функцию и ccall. В этом случае надо самому удалять параметры из стека

Re: Платформонезависимые библиотеки

Posted: Thu Mar 19, 2009 1:42 pm
by diamond
IgorA
Не слушай, что Veliant сказал, это полная ерунда, а не локальная переменная. Для заведения настоящих локальных переменных в нужном количестве нужно просто в начале процедуры зарезервировать место под неё в стеке, а в конце соответственно восстановить стек. При адресации через esp:

Code: Select all

func:
    sub esp, 4*4 ; выделяем место под 4 локальных переменных
    mov [esp+4], ebx ; сохраняем ebx в одну из локальных переменных
    add ebx, ecx
    mov [esp], ebx ; вторая локальная переменная
    ...
    mov eax, [esp+4] ; достаём значение первой локальной переменной
    add esp, 4*4 ; восстанавливаем стек
    ret ; выход из функции
Естественно, нужно отслеживать все push/pop и добавлять соответствующие поправки к esp.
При адресации через ebp:

Code: Select all

func:
    push ebp
    mov  ebp, esp
    sub  esp, 4*4 ; резервируем место в стеке
; теперь esp = ebp - 4*4, стек растёт вниз, так что дальнейшие push/pop не затронут [ebp-4], [ebp-4*2], [ebp-4*3], [ebp-4*4] - их можно использовать в качестве локальных переменных
    mov  [ebp-4], ebx
    add  ebx, ecx
    mov  [ebp-8], ebx
    ...
    mov  eax, [ebp-4]
    mov  esp, ebp ; восстанавливаем стек
    pop  ebp
    ret
Вместо mov esp,ebp/pop ebp можно использовать leave, она делает то же самое, но короче.

Re: Платформонезависимые библиотеки

Posted: Tue Mar 24, 2009 10:41 pm
by IgorA
Albom
Какие именно библиотеки ты хочешь перенести в Колибри ?
Я в том смысле что они будут делать, в данном случае я вижу сортировку целочисленных массивов (у меня есть сканированная книга дискретная математика алгоритмы и программы в ней есть описание разных алгоритмов : графы, массивы, ...)
Или может ты хочешь сделать какие библиотеки для геометрических вычислений для работы с графикой, или это будут библиотеки для работы с текстовыми функциями ... или еще что ?
Есть много разных направлений для деятельности, хотелось бы примерно узнать что будет ?

Re: Платформонезависимые библиотеки

Posted: Wed Mar 25, 2009 11:21 am
by Albom
Какие именно библиотеки ты хочешь перенести в Колибри ?
Во-первых, это моя библиотека gblib. Графический буфер. Есть уже статическая версия, которая использовалась при написании donkey и piton. Надо сделать экспорт, чтобы получилась динамическая.
Во-вторых, у меня есть исходники подобной библиотеки и кроме того в ней есть хорошие функции для работы с вещественными числами.
В-третьих, если возникнет необходимость (пока я её не вижу), то возможно сделаю библиотеку функций для сортировки методом вставок (просто супер для почти отсортированного массива). Но так как задачи простой сортировки массива чисел на практике не возникает (сортируются обычно структуры данных по одному из полей), то возникает вопрос целесообразности...

Re: Платформонезависимые библиотеки

Posted: Sat Apr 04, 2009 1:43 am
by Gluk
-на
stdcall tratata, dword[t],1,al
-пишет
invalid size of operand,
-хотя объявление
proc tratata stdcall t:dword, n:byte, v:byte
-в чем ошибка? если вместо al написать 1, все ок..

Re: Платформонезависимые библиотеки

Posted: Sat Apr 04, 2009 10:26 am
by Ghost
параметры dword`ного размера, хоть в объявлении и написано байт, но аргумент кладется в стек, посему он двойное слово, пиши eax

Re: Платформонезависимые библиотеки

Posted: Sat Apr 04, 2009 12:51 pm
by Albom
Библиотека gb_lib версии 0.5 с примером.

+ на ftp есть мои библиотеки:
wword.obj - извлечение текста из файлов MS Word 8.0 и 9.0
charset.obj - библиотека для преобразования русского текста в разных кодировках

Re: Платформонезависимые библиотеки

Posted: Sun Apr 05, 2009 1:58 am
by Gluk
описания к двум что на ftp есть?
во второй из тех что на ftp есть юникод?

Ghost, премного благодарен..

Re: Платформонезависимые библиотеки

Posted: Sun Apr 05, 2009 7:44 am
by Albom
1) описания как такового нет - только прототипы функций
wword.obj:

// Версия. 10 означает 0.1 (100 - 1.0, ...)
int version();

// filename - полный путь к доку
// buffer - буфер, должет быть не меньше размера дока
// mode - режим, пока не реализовано, указывать 0
// возвращаемое значение - число байт, записанных в буфер
int __stdcall convert (const char filename[], char buffer[], int mode);

charset.obj:

int version();

// 866 -> 1251
void __stdcall dos2win (const char text_in[], char text_out[]);
// 1251 -> 866
void __stdcall win2dos (const char text_in[], char text_out[]);
// koi8-r -> 866
void __stdcall koi2dos (const char text_in[], char text_out[]);

2) к сожалению, нет. :( поддерживаются только однобайтные кодировки. хотя, если использовать исходники wword.obj, то можно реализовать. просмотрев, исходники charset, обнаружил функцию utf2win, но работает ли она, я не помню (писалось это в августе прошлого года)...