Появилась идея перенести в Колибри несколько платформонезависимых библиотек.
У меня есть библиотеки как своего кода, так и чужого. В свободное время буду понемногу портировать... Кому интересно - присоединяйтесь...
Сегодня собрал библиотеку быстрой сортировки. Поддерживаются все типы данных. Передача параметров - stdcall. Есть пример использования.
Платформонезависимые библиотеки
-
- Attachments
-
-
qs-0.1.zip (11.1 KiB)Downloaded 333 times
-
2 вопроса:
Коды на С++, а можно ли их преобразовать в asm, или они сразу в obj компилятся ?
Это случайно не алгоритм сортировки методом Флойда ?
Коды на С++, а можно ли их преобразовать в asm, или они сразу в obj компилятся ?
Это случайно не алгоритм сортировки методом Флойда ?
IgorA
1) преобразовать-то можно всегда (я даже так пробовал). только зачем? выигрыша по скорости мы не получим, а по размеру выигрыш будет несущественный (ну будет не 3 кБ, а 2). зато для восприятия проще код, написанный вручную, а не сгенерированный компилятором (особенно ужасно читать метки циклов - не будешь же сидеть и придумывать осмысленные имена?...). компилировать в obj можно сразу. я использую gcc (MinGW).
2) нет, это классическая быстрая сортировка
1) преобразовать-то можно всегда (я даже так пробовал). только зачем? выигрыша по скорости мы не получим, а по размеру выигрыш будет несущественный (ну будет не 3 кБ, а 2). зато для восприятия проще код, написанный вручную, а не сгенерированный компилятором (особенно ужасно читать метки циклов - не будешь же сидеть и придумывать осмысленные имена?...). компилировать в obj можно сразу. я использую gcc (MinGW).
2) нет, это классическая быстрая сортировка
За тем чтобы лучше изучить ассемблер. Есть много вопросов, которые я могу запрограммировать на С++, и не могу тоже самое сделать на asm. А преобразовать в asm, пусть даже автоматом, и понять что как делается это интересно.преобразовать-то можно всегда (я даже так пробовал). только зачем?
Например: как сделать локальную переменную внутри функции, как программировать операции с плавающей точкой через сопроцессор... и т. д. Если можно преобразовать из С++ в asm то это очень хорошо.
2Igora:
Локальная переменная например так
или просто вынести перед функцией
операции с плавающей точкой - про FPU надо читать
(сопроцессор стековый потому вся работа с верхними ячейками стека)
FLD - загрузить вещественное число в стек
FILD - загрузить целое число в стек
FST - считать из стека
FIST - считать из стека целое
FADD - сложение
FSUB - вычитание
FMUL - умножение
FDIV - деление
а вообще у зубкова всё это есть))
Локальная переменная например так
Code: Select all
function:
jmp @b
.var dd 0
@@:
ret
операции с плавающей точкой - про FPU надо читать
(сопроцессор стековый потому вся работа с верхними ячейками стека)
FLD - загрузить вещественное число в стек
FILD - загрузить целое число в стек
FST - считать из стека
FIST - считать из стека целое
FADD - сложение
FSUB - вычитание
FMUL - умножение
FDIV - деление
а вообще у зубкова всё это есть))
Не @b, а @f.Veliant wrote:Code: Select all
function: jmp @b .var dd 0 @@: ret
Veliant
Локальные переменные размещаются в стеке, а не в сегменте кодаМожно объявить функцию и ccall. В этом случае надо самому удалять параметры из стека
Локальные переменные размещаются в стеке, а не в сегменте кода
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
IgorA
Не слушай, что Veliant сказал, это полная ерунда, а не локальная переменная. Для заведения настоящих локальных переменных в нужном количестве нужно просто в начале процедуры зарезервировать место под неё в стеке, а в конце соответственно восстановить стек. При адресации через esp:
Естественно, нужно отслеживать все push/pop и добавлять соответствующие поправки к esp.
При адресации через ebp:
Вместо mov esp,ebp/pop ebp можно использовать leave, она делает то же самое, но короче.
Не слушай, что 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 ; выход из функции
При адресации через 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
Ушёл к умным, знающим и культурным людям.
Albom
Какие именно библиотеки ты хочешь перенести в Колибри ?
Я в том смысле что они будут делать, в данном случае я вижу сортировку целочисленных массивов (у меня есть сканированная книга дискретная математика алгоритмы и программы в ней есть описание разных алгоритмов : графы, массивы, ...)
Или может ты хочешь сделать какие библиотеки для геометрических вычислений для работы с графикой, или это будут библиотеки для работы с текстовыми функциями ... или еще что ?
Есть много разных направлений для деятельности, хотелось бы примерно узнать что будет ?
Какие именно библиотеки ты хочешь перенести в Колибри ?
Я в том смысле что они будут делать, в данном случае я вижу сортировку целочисленных массивов (у меня есть сканированная книга дискретная математика алгоритмы и программы в ней есть описание разных алгоритмов : графы, массивы, ...)
Или может ты хочешь сделать какие библиотеки для геометрических вычислений для работы с графикой, или это будут библиотеки для работы с текстовыми функциями ... или еще что ?
Есть много разных направлений для деятельности, хотелось бы примерно узнать что будет ?
Во-первых, это моя библиотека gblib. Графический буфер. Есть уже статическая версия, которая использовалась при написании donkey и piton. Надо сделать экспорт, чтобы получилась динамическая.Какие именно библиотеки ты хочешь перенести в Колибри ?
Во-вторых, у меня есть исходники подобной библиотеки и кроме того в ней есть хорошие функции для работы с вещественными числами.
В-третьих, если возникнет необходимость (пока я её не вижу), то возможно сделаю библиотеку функций для сортировки методом вставок (просто супер для почти отсортированного массива). Но так как задачи простой сортировки массива чисел на практике не возникает (сортируются обычно структуры данных по одному из полей), то возникает вопрос целесообразности...
-на
stdcall tratata, dword[t],1,al
-пишет
invalid size of operand,
-хотя объявление
proc tratata stdcall t:dword, n:byte, v:byte
-в чем ошибка? если вместо al написать 1, все ок..
stdcall tratata, dword[t],1,al
-пишет
invalid size of operand,
-хотя объявление
proc tratata stdcall t:dword, n:byte, v:byte
-в чем ошибка? если вместо al написать 1, все ок..
И мы уже давно не пешки,
Мы пули, мы орлы, и решки!
Война ютит бинарный код,
Умри, или иди вперед!
Мы пули, мы орлы, и решки!
Война ютит бинарный код,
Умри, или иди вперед!
параметры dword`ного размера, хоть в объявлении и написано байт, но аргумент кладется в стек, посему он двойное слово, пиши eax
Библиотека gb_lib версии 0.5 с примером.
+ на ftp есть мои библиотеки:
wword.obj - извлечение текста из файлов MS Word 8.0 и 9.0
charset.obj - библиотека для преобразования русского текста в разных кодировках
+ на ftp есть мои библиотеки:
wword.obj - извлечение текста из файлов MS Word 8.0 и 9.0
charset.obj - библиотека для преобразования русского текста в разных кодировках
- Attachments
-
-
gb_lib-0.5.zip (11.66 KiB)Downloaded 324 times
-
описания к двум что на ftp есть?
во второй из тех что на ftp есть юникод?
Ghost, премного благодарен..
во второй из тех что на ftp есть юникод?
Ghost, премного благодарен..
И мы уже давно не пешки,
Мы пули, мы орлы, и решки!
Война ютит бинарный код,
Умри, или иди вперед!
Мы пули, мы орлы, и решки!
Война ютит бинарный код,
Умри, или иди вперед!
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, но работает ли она, я не помню (писалось это в августе прошлого года)...
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 325 times
-
Who is online
Users browsing this forum: No registered users and 26 guests