Board.KolibriOS.org

Official KolibriOS board
It is currently Sun Jul 05, 2020 11:26 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 17 posts ]  Go to page 1 2 Next
Author Message
PostPosted: Wed Mar 18, 2009 9:45 pm 
Offline
Mentor
User avatar

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

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


Attachments:
qs-0.1.zip [11.1 KiB]
Downloaded 210 times
Top
   
PostPosted: Thu Mar 19, 2009 1:12 am 
Offline
User avatar

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


Top
   
PostPosted: Thu Mar 19, 2009 7:26 am 
Offline
Mentor
User avatar

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


Top
   
PostPosted: Thu Mar 19, 2009 12:04 pm 
Offline
User avatar

Joined: Mon Oct 27, 2008 10:10 pm
Posts: 822
Quote:
преобразовать-то можно всегда (я даже так пробовал). только зачем?

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


Top
   
PostPosted: Thu Mar 19, 2009 12:56 pm 
Offline

Joined: Thu Jan 26, 2006 8:47 pm
Posts: 284
2Igora:
Локальная переменная например так
Code:
function:
    jmp @b
        .var dd 0
    @@:
ret

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

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


Top
   
PostPosted: Thu Mar 19, 2009 1:04 pm 
Offline

Joined: Fri Oct 12, 2007 1:04 pm
Posts: 141
Veliant wrote:
Code:
function:
    jmp @b
        .var dd 0
    @@:
ret

Не @b, а @f.


Top
   
PostPosted: Thu Mar 19, 2009 1:12 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Veliant

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


Top
   
PostPosted: Thu Mar 19, 2009 1:42 pm 
Offline
Kernel Developer
User avatar

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

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


Top
   
PostPosted: Tue Mar 24, 2009 10:41 pm 
Offline
User avatar

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


Top
   
PostPosted: Wed Mar 25, 2009 11:21 am 
Offline
Mentor
User avatar

Joined: Tue Jan 15, 2008 11:27 am
Posts: 756
Quote:
Какие именно библиотеки ты хочешь перенести в Колибри ?

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


Top
   
PostPosted: Sat Apr 04, 2009 1:43 am 
Offline
User avatar

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

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


Top
   
PostPosted: Sat Apr 04, 2009 10:26 am 
Offline
Kernel Developer
User avatar

Joined: Mon Mar 20, 2006 10:44 am
Posts: 558
параметры dword`ного размера, хоть в объявлении и написано байт, но аргумент кладется в стек, посему он двойное слово, пиши eax


Top
   
PostPosted: Sat Apr 04, 2009 12:51 pm 
Offline
Mentor
User avatar

Joined: Tue Jan 15, 2008 11:27 am
Posts: 756
Библиотека gb_lib версии 0.5 с примером.

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


Attachments:
gb_lib-0.5.zip [11.66 KiB]
Downloaded 190 times
Top
   
PostPosted: Sun Apr 05, 2009 1:58 am 
Offline
User avatar

Joined: Mon Apr 16, 2007 6:38 pm
Posts: 1222
описания к двум что на ftp есть?
во второй из тех что на ftp есть юникод?

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

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


Top
   
PostPosted: Sun Apr 05, 2009 7:44 am 
Offline
Mentor
User avatar

Joined: Tue Jan 15, 2008 11:27 am
Posts: 756
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, но работает ли она, я не помню (писалось это в августе прошлого года)...


Attachments:
charset.asm.zip [1.28 KiB]
Downloaded 186 times
Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 17 posts ]  Go to page 1 2 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 9 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited