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

Discussing libraries simplifying applications development
  • 2 вопроса:
    Коды на С++, а можно ли их преобразовать в asm, или они сразу в obj компилятся ?
    Это случайно не алгоритм сортировки методом Флойда ?
  • IgorA
    1) преобразовать-то можно всегда (я даже так пробовал). только зачем? выигрыша по скорости мы не получим, а по размеру выигрыш будет несущественный (ну будет не 3 кБ, а 2). зато для восприятия проще код, написанный вручную, а не сгенерированный компилятором (особенно ужасно читать метки циклов - не будешь же сидеть и придумывать осмысленные имена?...). компилировать в obj можно сразу. я использую gcc (MinGW).
    2) нет, это классическая быстрая сортировка
  • преобразовать-то можно всегда (я даже так пробовал). только зачем?
    За тем чтобы лучше изучить ассемблер. Есть много вопросов, которые я могу запрограммировать на С++, и не могу тоже самое сделать на asm. А преобразовать в asm, пусть даже автоматом, и понять что как делается это интересно.
    Например: как сделать локальную переменную внутри функции, как программировать операции с плавающей точкой через сопроцессор... и т. д. Если можно преобразовать из С++ в asm то это очень хорошо.
  • 2Igora:
    Локальная переменная например так

    Code: Select all

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

    а вообще у зубкова всё это есть))
  • Veliant wrote:

    Code: Select all

    function:
        jmp @b
            .var dd 0
        @@:
    ret
    
    Не @b, а @f.
  • 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. В этом случае надо самому удалять параметры из стека
  • 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, она делает то же самое, но короче.
    Ушёл к умным, знающим и культурным людям.
  • 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, все ок..
    И мы уже давно не пешки,
    Мы пули, мы орлы, и решки!
    Война ютит бинарный код,
    Умри, или иди вперед!
  • параметры dword`ного размера, хоть в объявлении и написано байт, но аргумент кладется в стек, посему он двойное слово, пиши eax
  • Библиотека 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 321 times
  • описания к двум что на ftp есть?
    во второй из тех что на 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, но работает ли она, я не помню (писалось это в августе прошлого года)...
    Attachments
    charset.asm.zip (1.28 KiB)
    Downloaded 321 times
  • Who is online

    Users browsing this forum: No registered users and 5 guests