Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Вт сен 26, 2017 8:39 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 17 сообщений ]  На страницу 1 2 След.
Автор Сообщение
 Заголовок сообщения: Платформонезависимые библиотеки
СообщениеДобавлено: Ср мар 18, 2009 9:45 pm 
Не в сети
Mentor
Аватара пользователя

Зарегистрирован: Вт янв 15, 2008 11:27 am
Сообщения: 750
Появилась идея перенести в Колибри несколько платформонезависимых библиотек.
У меня есть библиотеки как своего кода, так и чужого. В свободное время буду понемногу портировать... Кому интересно - присоединяйтесь...

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


Вложения:
qs-0.1.zip [11.1 КБ]
131 скачивание
Вернуться к началу
СообщениеДобавлено: Чт мар 19, 2009 1:12 am 
Не в сети
Аватара пользователя

Зарегистрирован: Пн окт 27, 2008 10:10 pm
Сообщения: 742
2 вопроса:
Коды на С++, а можно ли их преобразовать в asm, или они сразу в obj компилятся ?
Это случайно не алгоритм сортировки методом Флойда ?


Вернуться к началу
СообщениеДобавлено: Чт мар 19, 2009 7:26 am 
Не в сети
Mentor
Аватара пользователя

Зарегистрирован: Вт янв 15, 2008 11:27 am
Сообщения: 750
IgorA
1) преобразовать-то можно всегда (я даже так пробовал). только зачем? выигрыша по скорости мы не получим, а по размеру выигрыш будет несущественный (ну будет не 3 кБ, а 2). зато для восприятия проще код, написанный вручную, а не сгенерированный компилятором (особенно ужасно читать метки циклов - не будешь же сидеть и придумывать осмысленные имена?...). компилировать в obj можно сразу. я использую gcc (MinGW).
2) нет, это классическая быстрая сортировка


Вернуться к началу
СообщениеДобавлено: Чт мар 19, 2009 12:04 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пн окт 27, 2008 10:10 pm
Сообщения: 742
Цитата:
преобразовать-то можно всегда (я даже так пробовал). только зачем?

За тем чтобы лучше изучить ассемблер. Есть много вопросов, которые я могу запрограммировать на С++, и не могу тоже самое сделать на asm. А преобразовать в asm, пусть даже автоматом, и понять что как делается это интересно.
Например: как сделать локальную переменную внутри функции, как программировать операции с плавающей точкой через сопроцессор... и т. д. Если можно преобразовать из С++ в asm то это очень хорошо.


Вернуться к началу
СообщениеДобавлено: Чт мар 19, 2009 12:56 pm 
Не в сети

Зарегистрирован: Чт янв 26, 2006 8:47 pm
Сообщения: 284
2Igora:
Локальная переменная например так
Код:
function:
    jmp @b
        .var dd 0
    @@:
ret

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

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


Вернуться к началу
СообщениеДобавлено: Чт мар 19, 2009 1:04 pm 
Не в сети

Зарегистрирован: Пт окт 12, 2007 1:04 pm
Сообщения: 141
Veliant писал(а):
Код:
function:
    jmp @b
        .var dd 0
    @@:
ret

Не @b, а @f.


Вернуться к началу
СообщениеДобавлено: Чт мар 19, 2009 1:12 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3928
Veliant

Локальные переменные размещаются в стеке, а не в сегменте кода
Код:
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. В этом случае надо самому удалять параметры из стека


Вернуться к началу
СообщениеДобавлено: Чт мар 19, 2009 1:42 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Пн ноя 28, 2005 8:00 pm
Сообщения: 1601
IgorA
Не слушай, что Veliant сказал, это полная ерунда, а не локальная переменная. Для заведения настоящих локальных переменных в нужном количестве нужно просто в начале процедуры зарезервировать место под неё в стеке, а в конце соответственно восстановить стек. При адресации через esp:
Код:
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:
Код:
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, она делает то же самое, но короче.

_________________
Ушёл к умным, знающим и культурным людям.


Вернуться к началу
СообщениеДобавлено: Вт мар 24, 2009 10:41 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пн окт 27, 2008 10:10 pm
Сообщения: 742
Albom
Какие именно библиотеки ты хочешь перенести в Колибри ?
Я в том смысле что они будут делать, в данном случае я вижу сортировку целочисленных массивов (у меня есть сканированная книга дискретная математика алгоритмы и программы в ней есть описание разных алгоритмов : графы, массивы, ...)
Или может ты хочешь сделать какие библиотеки для геометрических вычислений для работы с графикой, или это будут библиотеки для работы с текстовыми функциями ... или еще что ?
Есть много разных направлений для деятельности, хотелось бы примерно узнать что будет ?


Вернуться к началу
СообщениеДобавлено: Ср мар 25, 2009 11:21 am 
Не в сети
Mentor
Аватара пользователя

Зарегистрирован: Вт янв 15, 2008 11:27 am
Сообщения: 750
Цитата:
Какие именно библиотеки ты хочешь перенести в Колибри ?

Во-первых, это моя библиотека gblib. Графический буфер. Есть уже статическая версия, которая использовалась при написании donkey и piton. Надо сделать экспорт, чтобы получилась динамическая.
Во-вторых, у меня есть исходники подобной библиотеки и кроме того в ней есть хорошие функции для работы с вещественными числами.
В-третьих, если возникнет необходимость (пока я её не вижу), то возможно сделаю библиотеку функций для сортировки методом вставок (просто супер для почти отсортированного массива). Но так как задачи простой сортировки массива чисел на практике не возникает (сортируются обычно структуры данных по одному из полей), то возникает вопрос целесообразности...


Вернуться к началу
СообщениеДобавлено: Сб апр 04, 2009 1:43 am 
Не в сети
Аватара пользователя

Зарегистрирован: Пн апр 16, 2007 6:38 pm
Сообщения: 1222
-на
stdcall tratata, dword[t],1,al
-пишет
invalid size of operand,
-хотя объявление
proc tratata stdcall t:dword, n:byte, v:byte
-в чем ошибка? если вместо al написать 1, все ок..

_________________
И мы уже давно не пешки,
Мы пули, мы орлы, и решки!
Война ютит бинарный код,
Умри, или иди вперед!


Вернуться к началу
СообщениеДобавлено: Сб апр 04, 2009 10:26 am 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Пн мар 20, 2006 10:44 am
Сообщения: 557
параметры dword`ного размера, хоть в объявлении и написано байт, но аргумент кладется в стек, посему он двойное слово, пиши eax


Вернуться к началу
СообщениеДобавлено: Сб апр 04, 2009 12:51 pm 
Не в сети
Mentor
Аватара пользователя

Зарегистрирован: Вт янв 15, 2008 11:27 am
Сообщения: 750
Библиотека gb_lib версии 0.5 с примером.

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


Вложения:
gb_lib-0.5.zip [11.66 КБ]
108 скачиваний
Вернуться к началу
СообщениеДобавлено: Вс апр 05, 2009 1:58 am 
Не в сети
Аватара пользователя

Зарегистрирован: Пн апр 16, 2007 6:38 pm
Сообщения: 1222
описания к двум что на ftp есть?
во второй из тех что на ftp есть юникод?

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

_________________
И мы уже давно не пешки,
Мы пули, мы орлы, и решки!
Война ютит бинарный код,
Умри, или иди вперед!


Вернуться к началу
СообщениеДобавлено: Вс апр 05, 2009 7:44 am 
Не в сети
Mentor
Аватара пользователя

Зарегистрирован: Вт янв 15, 2008 11:27 am
Сообщения: 750
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, но работает ли она, я не помню (писалось это в августе прошлого года)...


Вложения:
charset.asm.zip [1.28 КБ]
104 скачивания
Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 17 сообщений ]  На страницу 1 2 След.

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB