Masm to Fasm

Applications development, KoOS API questions
  • Не уверен, но регистр может иметь важное значение. Регистр имени файла. Еще можно попробовать ФАСМ более старой версии.
  • SoUrcerer wrote:Не уверен, но регистр может иметь важное значение. Регистр имени файла. Еще можно попробовать ФАСМ более старой версии.
    Попробовал предложенный варианты, вот что выдало:

    Code: Select all

    fasm doexe.asm
    flat assembler  version 1.67.26  (1511235 kilobytes memory)
    doexe.asm [10]:
    file 'Hellos.kos':physofs,sz
    error: error reading file.
    мне кажется это просто косяк в структуре Hellos.kos, что построчно делает doexe.asm ??? В общих чертах понимаю, что вроде как режет РЕ заголовок, но как это делает не совсем понятно.
  • Akyltist
    А что нужно из Hellos.kos сделать ? Приложение Колибри, coff dll ?
  • Приложение колибри!
  • Не получится, в файле нет заголовка программы Колибри.

    Советую не мучиться и использовать gnu ld и objcopy. Проверенный временем скрипт для mingw версии
    Spoiler:/*OUTPUT_FORMAT("binary")*/

    ENTRY(__start)
    SECTIONS
    {
    .text 0x000000:
    {
    LONG(0x554e454D);
    LONG(0x32305445);
    LONG(1);
    LONG(__start);
    LONG(___iend);
    LONG(___memsize);
    LONG(___stacktop);
    LONG(___cmdline);
    LONG(___pgmname); /* full path */
    LONG(0); /*FIXME tls data */

    *(.init)
    *(.text)
    *(SORT(.text$*))
    *(.text.*)
    *(.glue_7t)
    *(.glue_7)
    ___CTOR_LIST__ = .; __CTOR_LIST__ = . ;
    LONG (-1);*(.ctors); *(.ctor); *(SORT(.ctors.*)); LONG (0);
    ___DTOR_LIST__ = .; __DTOR_LIST__ = . ;
    LONG (-1); *(.dtors); *(.dtor); *(SORT(.dtors.*)); LONG (0);
    *(.fini)
    /* ??? Why is .gcc_exc here? */
    *(.gcc_exc)
    PROVIDE (etext = .);
    *(.gcc_except_table)
    }

    .rdata ALIGN(16) :
    {
    *(.rdata)
    *(SORT(.rdata$*))
    ___RUNTIME_PSEUDO_RELOC_LIST__ = .;
    __RUNTIME_PSEUDO_RELOC_LIST__ = .;
    *(.rdata_runtime_pseudo_reloc)
    ___RUNTIME_PSEUDO_RELOC_LIST_END__ = .;
    __RUNTIME_PSEUDO_RELOC_LIST_END__ = .;
    }
    .CRT ALIGN(16) :
    {
    ___crt_xc_start__ = . ;
    *(SORT(.CRT$XC*)) /* C initialization */
    ___crt_xc_end__ = . ;
    ___crt_xi_start__ = . ;
    *(SORT(.CRT$XI*)) /* C++ initialization */
    ___crt_xi_end__ = . ;
    ___crt_xl_start__ = . ;
    *(SORT(.CRT$XL*)) /* TLS callbacks */
    /* ___crt_xl_end__ is defined in the TLS Directory support code */
    ___crt_xp_start__ = . ;
    *(SORT(.CRT$XP*)) /* Pre-termination */
    ___crt_xp_end__ = . ;
    ___crt_xt_start__ = . ;
    *(SORT(.CRT$XT*)) /* Termination */
    ___crt_xt_end__ = . ;
    }

    .data ALIGN(16) :
    {
    __data_start__ = . ;
    *(.data)
    *(.data2)
    *(SORT(.data$*))
    *(.jcr)
    __CRT_MT = .;
    LONG(0);
    __data_end__ = . ;
    *(.data_cygwin_nocopy)
    }

    .eh_frame ALIGN(16) :
    {
    *(.eh_frame)
    ___iend = . ;
    }

    bss ALIGN(16):
    {
    *(.bss)
    *(COMMON)
    . = ALIGN(16);
    ___cmdline = .; Командная строка
    . = . + 256;
    ___pgmname = .; Путь к программе
    . = . + 1024 + 16; Здесь надо установить необходимый размер стека.
    ___stacktop = .;
    ___memsize = . ;
    }

    /DISCARD/ :
    {
    *(.debug$S)
    *(.debug$T)
    *(.debug$F)
    *(.drectve)
    *(.note.GNU-stack)
    *(.comment)
    *(.debug_abbrev)
    *(.debug_info)
    *(.debug_line)
    *(.debug_frame)
    *(.debug_loc)
    *(.debug_pubnames)
    *(.debug_aranges)
    *(.debug_ranges)
    }
    }
  • Serge wrote:Не получится, в файле нет заголовка программы Колибри.
    Логично, он ведь MZ (PE)
    В общем коряво но удалось таки запустить программку на Delphi от Борланда под Kolibry OS (собственно именно по этому второй вариант не подходит)
    Размер выходного файла 688 байт, без сжатия.
    Image
    Собственно о пригодности для кодинга говорить не приходится. Но компилирует программку:
    Spoiler:

    Code: Select all

    unit demo;
    interface
    procedure main;
    implementation
    
    procedure main;
    label xstart,xdraw,xstill,xkey,xbutton,xexit;
    begin
    asm
    
    xstart:
        call    xdraw
    
    xstill:
        mov     eax,10                        // функция 10 - ждать события
        int     $40                           // Прерывание
        cmp     eax,1                         // перерисовать окно ?
        je      xstart                        // если да - на метку xstart
        cmp     eax,2                         // нажата клавиша ?
        je      xkey                          // если да - на key
        cmp     eax,3                         // нажата кнопка ?
        je      xbutton                       // если да - на button
        jmp     xstill                        // если другое событие - в начало цикла
    
    xkey:
        mov     eax,10                        // функция 2 - считать код символа (в ah) (тут в принципе не нужна)
        int     $40                           // Прерывание
        jmp     xstill                        // вернуться к началу цикла
    
    xbutton:
        mov     eax,17                        // функция 17 - получить идентификатор нажатой кнопки
        int     $40                           // Прерывание
        cmp     ah, 1                         // если нажата кнопка с номером 1,
        jz      xexit                         // выходим
        jmp     xstill                        // вернуться к началу цикла
      xexit:
        mov     eax,-1                        // функция -1 - выход
        int     $40                           // Прерывание
    
      xdraw:
        mov     eax,12                        // функция 12: означает, что будет рисоваться окно
        mov     ebx,1                         // 1,начало рисования
        int     $40                           // Прерывание
    
        xor     eax,eax                       // Очищаем eax (mov eax,0) (Функция 0)
        mov     ebx,200 shl 16+317            // [координата по оси x]*65536 + [размер по оси x]
        add     ecx,200 shl 16+116            // Высота скина + [координата по y]*65536 + [размер по y]
        mov     edx,$33FFFFFF
        //or      edx,$34000000                 // Или окно со скином фиксированных размеров
        int     $40                           // Прерывание
    
        mov     eax,12                        // функция 12: означает, что будет рисоваться окно
        mov     ebx,2                         // 1,начало рисования
        int     $40                           // Прерывание
        ret
    end;
    
    end;
    
    begin
      main;
    end.
    Сорцы и утилиты прилогаются 630kb. (всё делает build.bat)
    http://akyltist.ucoz.org/asm/delphi.zip
    Attachments
    delphi.zip (630.03 KiB)
    Downloaded 476 times
  • А почему не FreePascal?
  • SoUrcerer wrote:А почему не FreePascal?
    1) компилятор от борланда лучше оптимизирует и меньше мусора даёт
    2) вроде на делфи для колибри ещё ничего не создавали (может и ошибаюсь)
    3) rlt на svn для fpc нерабочий, за отсутствием файла systemh.inc , собственно это поправить надо будет всего лишь

    собственно все не принципиально, т.к. кодить на фасм все равно буду учиться кодить. а делфи это так, баловство.
  • SoUrcerer wrote:А почему не FreePascal?
    FPC выдает файлы непотребного размера, а его исходнки имеют сишный стиль (include на include), что совершенно не способствует изучению.
    Akyltist wrote:2) вроде на делфи для колибри ещё ничего не создавали (может и ошибаюсь)
    Я пробовал было потыкаться с Delphi, но понял, что Delphi 6 не умеет собирать программы с Image Base = 0, а obj-файлы у него -- уже не обычный OMF, а какой-то особый, который ни один сторонний линковщик не понимает.

    Короче, я потыкался-потыкался и понял, что с наскока тут разобраться не получится, а на серьезные исследования времени нет. Да и никому это не надо было, поскольку второго паскалиста не было.

    Akyltist, версия 10.0 -- это Delphi 3?
    Akyltist wrote:делфи это так, баловство.
    На самом деле качественная поддержка ЯВУ -- очень хорошее дело, хоть и не совсем вписывается в концепцию ассемблерной ОС. Не все задачи можно решить на ассемблере.
  • Не все задачи можно решить на ассемблере.
    Не люблю флудить, но это высказывание так безоговорочно и так совершенно не верно, что жаждет ответа. ;)
    Все задачи можно (и нужно) решить на ассемблере. Я это гарантирую. :D
  • Можно да, нужно - не всегда. Колибри давно уже не концепция ассемблерной ОС. Маленькая и быстрая - да.
  • Who is online

    Users browsing this forum: No registered users and 10 guests