Вопрос

No comments
  • Как-то, так!

    ;---------------------------------------------------------------------;
    ;--- ЗАГОЛОВОК ПРОГРАММЫ. ------------------------------------------;
    ;---------------------------------------------------------------------;

    use32 ; включить 32-битный режим ассемблера.
    org 0x0 ; адресация с нуля.

    db 'MENUET01' ; 8-байтный идентификатор MenuetOS.
    dd 0x01 ; версия заголовка (всегда 1).
    dd START ; адрес первой команды.
    dd I_END ; размер программы.
    dd I_END ; количество памяти.
    dd STACK_TOP ; адрес вершины стэка.
    dd CMDLINE ; адрес буфера для параметров.
    dd 0x0 ; зарезервировано.

    include "macros.inc" ; макросы облегчают жизнь ассемблерщиков!

    ;---------------------------------------------------------------------;
    ;--- КОД ПРОГРАММЫ. ------------------------------------------------;
    ;---------------------------------------------------------------------;

    START: ; начало программы.

    .exit:
    mcall -1 ; иначе конец программы.

    ;---------------------------------------------------------------------;
    ;--- ДАННЫЕ ПРОГРАММЫ. ---------------------------------------------;
    ;---------------------------------------------------------------------;

    title db 'Пример программы',0

    ;---------------------------------------------------------------------;

    CMDLINE: rb 4096 ; буфер для параметров.
    rb 4096
    STACK_TOP: ; вершина стэка.

    I_END: ; метка конца программы
  • Или даже так!

    ;---------------------------------------------------------------------;
    ;--- ЗАГОЛОВОК ПРОГРАММЫ. ------------------------------------------;
    ;---------------------------------------------------------------------;

    use32 ; включить 32-битный режим ассемблера.
    org 0x0 ; адресация с нуля.

    db 'MENUET01' ; 8-байтный идентификатор MenuetOS.
    dd 0x01 ; версия заголовка (всегда 1).
    dd START ; адрес первой команды.
    dd IM_END ; размер программы.
    dd I_END ; количество памяти.
    dd STACK_TOP ; адрес вершины стэка.
    dd CMDLINE ; адрес буфера для параметров.
    dd 0x0 ; зарезервировано.

    include "macros.inc" ; макросы облегчают жизнь ассемблерщиков!

    ;---------------------------------------------------------------------;
    ;--- КОД ПРОГРАММЫ. ------------------------------------------------;
    ;---------------------------------------------------------------------;

    START: ; начало программы.

    .exit:
    mcall -1 ; иначе конец программы.

    ;---------------------------------------------------------------------;
    ;--- ДАННЫЕ ПРОГРАММЫ. ---------------------------------------------;
    ;---------------------------------------------------------------------;

    title db 'Пример программы',0

    ;---------------------------------------------------------------------;

    IM_END:


    CMDLINE: rb 4096 ; буфер для параметров.
    rb 4096
    STACK_TOP: ; вершина стэка.

    I_END:
  • [quote="Yason"]Или даже так!

    ;---------------------------------------------------------------------;
    ;--- ЗАГОЛОВОК ПРОГРАММЫ. ------------------------------------------;
    ;---------------------------------------------------------------------;

    use32 ; включить 32-битный режим ассемблера.
    org 0x0 ; адресация с нуля.

    db 'MENUET01' ; 8-байтный идентификатор MenuetOS.
    dd 0x01 ; версия заголовка (всегда 1).
    dd START ; адрес первой команды.
    dd IM_END ; размер программы.
    dd I_END ; количество памяти.
    dd STACK_TOP ; адрес вершины стэка.
    dd CMDLINE ; адрес буфера для параметров.
    dd 0x0 ; зарезервировано.

    include "macros.inc" ; макросы облегчают жизнь ассемблерщиков!

    ;---------------------------------------------------------------------;
    ;--- КОД ПРОГРАММЫ. ------------------------------------------------;
    ;---------------------------------------------------------------------;

    START: ; начало программы.

    .exit:
    mcall -1 ; иначе конец программы.

    ;---------------------------------------------------------------------;
    ;--- ДАННЫЕ ПРОГРАММЫ. ---------------------------------------------;
    ;---------------------------------------------------------------------;

    title db 'Пример программы',0

    ;---------------------------------------------------------------------;

    IM_END:

    CMDLINE: rb 4096 ; буфер для параметров.
    rb 4096
    STACK_TOP: ; вершина стэка.

    I_END:[/quote]
  • Короче, ошибка "Файл не является исполняемым" возможно связана с неправильными значениями в заголовке. Там нужно не цифры ставить, а метки, тогда всё будет правильно. В большинстве случаев, "количество памяти" и "адрес вершины стэка" равны финальной метке, а "размер программы" указывает на конец кода / начало данных.
  • CMDLINE: rb 4096 ; буфер для параметров.
    rb 4096
    STACK_TOP: ; вершина стэка.

    Ну а если у меня несколько модулей (include) будет в программе и при каждом модуле свои данные что тогда ?

    2. Что-то я ничего не понял пока с подключениями модулей... в том смысле
    что допустим существует Main.asm и модули допустим u1,u2,u3....
    в дельфи, например, какой модуль в каком используешь в там его и подключаешь (uses) вот только если один в другом используешь (друг в друге), то зависит в какой секции его подключаешь interface или implementation, ну это не сложно....

    тут в ФАСМ хрен поймёшь....
    в Main.asm подключаешь u1, если в u1 уже подключён u2, то его что уже в Main.asm подключать не надо ? всё модуля u2 становится доступно для Main.asm ?
    но интересное пожалуй следующее... когда мне при этом всём еще надо u1 и u2 сделать доступными друг-у-друга да и в Main.asm естественно чтобы они оба доступны были.
    КАК ЭТО ВСЁ ДЕЛАЕТСЯ ?
  • ... короче, :-) можно ли раз и навсегда сделать все модули доступные везде ? Как это делается ?
  • ALEXS1983 писал:
    > CMDLINE: rb 4096 ; буфер для параметров.
    > rb 4096
    > STACK_TOP: ; вершина стэка.
    >
    > Ну а если у меня несколько модулей (include) будет в программе и при каждом модуле
    > свои данные что тогда ?
    Тут имеются параметры командной строки, а не данные программы. Т.е. например есть графический редактор и при его запуске из CMDLINE можно взять путь к открываемому файлу изображения. Но при обычном запуске программы там ничего не будет.
    А свои данные можно писать в любом месте программы.
  • [quote="ALEXS1983"]... короче, :-) можно ли раз и навсегда сделать все модули доступные везде ? Как это делается ?[/quote]

    Ну вот, допустим, есть main.asm и 4 модуля: module0.inc, module1.inc, module2.inc, module3.inc.

    ====================================================================================================
    main.asm
    include 'module0.inc' ; подключаем глобалльный модуль(с набором других модулей), к main.asm,
    ; функции и данные из которого будут доступны везде.
    ----------------------------------------------------------------------------------------------------
    module0.inc ; глобальный модуль.
    include 'module1.inc' ; подключаем 1-й модуль, к module0.inc.
    include 'module2.inc' ; подключаем 2-й модуль, к module0.inc.
    include 'module3.inc' ; подключаем 3-й модуль, к module0.inc.
    module1.inc ; модуль с 1 и более фйнкий.
    module2.inc ; модуль с 1 и более фйнкий.
    module3.inc ; модуль с 1 и более фйнкий.
    ====================================================================================================

    ИЛИ ТАК...

    ====================================================================================================
    main.asm
    ; функции и данные из этих модулей будут доступны везде.
    include 'module1.inc' ; подключаем 1-й глобалльный модуль.
    include 'module2.inc' ; подключаем 2-й глобалльный модуль.
    include 'module3.inc' ; подключаем 3-й глобалльный модуль.
    ----------------------------------------------------------------------------------------------------
    module1.inc ; модуль с 1 и более фйнкий.
    module2.inc ; модуль с 1 и более фйнкий.
    module3.inc ; модуль с 1 и более фйнкий.
    ====================================================================================================

    Include'ы можно делать в любом месте исходника. Только макросы надо объявлять заранее, до их использования (на счёт макро-процедур PROC, не помню).

    Вот, кака-то так.
  • [quote="Yason"]Только макросы надо объявлять заранее, до их использования (на счёт макро-процедур PROC, не помню).[/quote]

    Макросы и Include'ы с макросами, имеется ввиду.
  • Короче, в ФАСМе нет такого понятия, как доступность. Если что-то где-то подключено, то оно доступно везде.
    В формате Menuet01 нету секций, так что расположение данных чисто условно.
  • ну вот это для меня точно проще повесится.... :-)
    Нужно скорректировать цвета для КОС путём перестановки самих байтов(1,2,3,4) PutPixel_color `а который dword (т.е. PutPixel_color rd 1).
    Нужна процедура в которой можно регулировать перестановку,
    т.е. (С 1 на 3, с 3 на 1 байт) или (с 2 на 4, с 4 на 2 байт) и т.д.
    В общем для понятности выложу код на дельфи

    var PutPixel_color:Cardinal;

    Procedure TMainForm.ConvToColor; // Преобразование цветов
    Var B:Byte;
    Var byte_: array[1..4] of byte; cardinal_:cardinal absolute byte_;
    begin
    cardinal_:= PutPixel_color;
    B:=Byte_[1];Byte_[1]:=Byte_[3]; Byte_[3]:=b; PutPixel_color:=Cardinal_;
    end;


    На асме получилось вот такое....
    B rd 4
    PutPixel_color rd 1
    convColorToKOS:
    mov eax,B
    mov edx,[PutPixel_color]
    mov [eax],edx
    mov dl,[eax]
    mov byte [B],dl
    mov dl,[eax+$02]
    mov [eax],dl
    mov dl,byte [B]
    mov [eax+$02],dl
    mov eax,[eax]
    mov [PutPixel_color],eax
    ret
    Правильно ли ? как регулировать перемещения?
    ПРОШУ ПОМОЩИ!
  • [quote="ALEXS1983"]ну вот это для меня точно проще повесится.... :-)
    Нужно скорректировать цвета для КОС путём перестановки самих байтов(1,2,3,4) PutPixel_color `а который dword (т.е. PutPixel_color rd 1).
    Нужна процедура в которой можно регулировать перестановку,
    т.е. (С 1 на 3, с 3 на 1 байт) или (с 2 на 4, с 4 на 2 байт) и т.д.
    ПРОШУ ПОМОЩИ![/quote]

    Всё, очень просто (если, я правильно тебя понял)! Вот.

    ;-----------------------------------------------------;

    PIXEL:
    .red db 0
    .green db 0
    .blue db 0
    .alpha db 0

    pixel_color: dd 0xff332211

    ;-----------------------------------------------------;

    pixel.convert_bgr_to_rgb.32bit:
    mov eax, dword [pixel_color]
    bswap eax
    ror eax,8
    mov [PIXEL.blue], byte al
    mov [PIXEL.green], byte ah
    ror eax,16
    mov [PIXEL.red], byte al
    mov [PIXEL.alpha], byte ah
    ret

    ;-----------------------------------------------------;
  • Хотя .alpha, вроде вначале должно быть. Сейчас не помню.

    PIXEL:
    .alpha db 0
    .red db 0
    .green db 0
    .blue db 0
  • Или так!

    ;-----------------------------------------------------;

    pixel_color1: dd 0xff332211
    pixel_color2: dd 0x00000000

    ;-----------------------------------------------------;

    convert_bgr_to_rgb.32bit:
    mov eax, dword [pixel_color1]
    rol eax, 8
    mov [pixel_color2], dword eax ; [pixel_color2] = 0xff112233
    ret

    ;-----------------------------------------------------;
  • Who is online

    Users browsing this forum: No registered users and 3 guests